如何在XSLT中合并两个XML文件,并使用c#中的编译转换生成一个HTML输出

本文关键字:转换 编译 输出 HTML 一个 合并 XSLT 两个 文件 XML | 更新日期: 2023-09-27 18:21:21

我有两个XML文件,看起来像:

...........
XML File 1:
...........
<Result>
  <Id>111</Id> 
  <Title>Result 111 title</Title>
  <Description>Result 111 Description</Description>
</Result>
...........
XML File 2:
...........
<Result>
  <Id>222</Id> 
  <Title>Result 222 title</Title>
  <Description>Result 222 Description</Description>
</Result>

我有一个XSLT,它可以生成这样的设计:

|ID |
|Title :| |Result 111 Title|
|Description:| |Result 111 Description|     

我想要的是,我还想添加来自第二个XML文件的元素值,这样设计就会看起来像这样:

|ID |
|Title :| |Result 111 Title|
|Description:| |Result 111 Description|
|ID |
|Title :| |Result 222 Title|
|Description:| |Result 222 Description|    

此设计将在C#中的运行期间生成。到目前为止,我已经将一个XML应用于一个XSLT。但这是不同的。我怎样才能做到这一点。请将"||"视为"标记的设计。非常感谢您的帮助。谢谢…!:)

如何在XSLT中合并两个XML文件,并使用c#中的编译转换生成一个HTML输出

类似的东西(受这个答案的启发):

var xslt = new XslCompiledTransform();
xslt.Load("merge.xslt", new XsltSettings{EnableDocumentFunction = true}, null );
var xmlr = XmlReader.Create("first.xml");
var xmlw = XmlWriter.Create("result.html");
var xslargs = new XsltArgumentList();
xslargs.AddParam("fileName", "", "second.xml");
xslt.Transform(xmlr, xslargs , xmlw);, xmlw);

和xslt:

  <xsl:output method="html" indent="yes"/>
  <xsl:param name="fileName" select="'somefile'" />
  <xsl:param name="updates" select="document($fileName)" />
  <xsl:variable name="updateItems" select="$updates/*" />
  <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>
  <xsl:template match="/">
    <merge>
    <xsl:copy>
      <xsl:apply-templates select="*" />
      <xsl:apply-templates select="$updateItems" />
    </xsl:copy>
    </merge>
  </xsl:template>

仔细想想,这可以更容易地实现,您可以添加大量要合并的文件。

代码

var xslt = new XslCompiledTransform();
xslt.Load("merge.xslt", new XsltSettings{EnableDocumentFunction = true}, null );
using (var xmlr = XmlReader.Create(
    new StringReader(@"<files><file>first.xml</file><file>second.xml</file></files>")))
{
    using (var xmlw = XmlWriter.Create("result.html"))
    { 
        xslt.Transform(xmlr, null , xmlw);
    }
}

Xslt

<xsl:template match="/">
    <html>
      <body>
        <xsl:for-each select="/files/file">
          <xsl:apply-templates select="document(.)/*" />
        </xsl:for-each>
      </body>
    </html>
  </xsl:template>

参考文献:
加载
转换