如何在XsltArgumentList中传递动态创建的xml

本文关键字:动态 创建 xml XsltArgumentList | 更新日期: 2023-09-27 18:10:16

我在这里修复,我必须通过c#代码动态创建的xml传递给xslt作为参数,然后从中获取值。

下面是XSLT示例
<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt"
  version="1.0">
  <xsl:param name="Keys"></xsl:param>  
  <xsl:template match="/">
    <MyKey>MYNODE</MyKey>
    <xsl:value-of select="msxsl:node-set($Keys)/Keys/Item/Header"/> 
  </xsl:template>
</xsl:stylesheet>

然后从c#代码中调用Transform方法

XslCompiledTransform proc = new XslCompiledTransform();
proc.Load("sheet.xslt");
XsltArgumentList xsltArgs = new XsltArgumentList();
XmlDocument doc1 = new XmlDocument();
// populate as needed e.g.
doc1.LoadXml("<Keys><Item><Header>fooHeader</Header></Item></Keys>");
xsltArgs.AddParam("Keys", "", doc1.InnerXml.ToString());
// pass xsltArgs as second argument to Transform method
proc.Transform(someInput, xsltArgs, someOutput);

在这里,我无法在结果中获得MYNODE的值由于

如何在XsltArgumentList中传递动态创建的xml

这里有两个问题。首先,如何传递参数

xsltArgs.AddParam("doc1", "", doc1);

但是在你的XSLT中你把它命名为"Keys"

<xsl:param name="Keys"></xsl:param>  

因此你需要修改你的c#代码

xsltArgs.AddParam("Keys", "", doc1);

XSLT也有一个问题。

<xsl:value-of select="msxsl:node-set($Keys)/Keys/item/header"/> 

XML区分大小写。您的XML包含"Item",但XSLT正在查找"Item"。应该是这些

<xsl:value-of select="msxsl:node-set($Keys)/Keys/Item/Header"/> 

事实上,我认为这里不需要节点集。试试这个

<xsl:value-of select="$Keys/Keys/Item/Header"/> 

使用

构建文档后
XmlDocument doc1 = new XmlDocument();
// populate as needed e.g.
doc1.LoadXml("<Keys><Item><Header>fooHeader</Header></Item></Keys>");

你应该将该文档作为参数值传入

xsltArgs.AddParam("Keys", "", doc1);

那么你应该可以像

那样使用这个参数
<xsl:param name="Keys"></xsl:param>  
  <xsl:template match="/">
    <MyKey>MYNODE</MyKey>
    <xsl:value-of select="$Keys/Keys/Item/Header"/> 
  </xsl:template>
完整的例子,c#是
        XslCompiledTransform proc = new XslCompiledTransform();
        proc.Load("../../XSLTFile1.xslt");
        XsltArgumentList xsltArgs = new XsltArgumentList();
        XmlDocument doc1 = new XmlDocument();
        // populate as needed e.g.
        doc1.LoadXml("<Keys><Item><Header>fooHeader</Header></Item></Keys>");
        xsltArgs.AddParam("Keys", "", doc1);
        proc.Transform(new XmlDocument(), xsltArgs, Console.Out);

XSLT是

<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt"
  version="1.0">
  <xsl:param name="Keys"></xsl:param>
  <xsl:template match="/">
    <MyKey>MYNODE</MyKey>
    <xsl:value-of select="$Keys/Keys/Item/Header"/>
  </xsl:template>
</xsl:stylesheet>

到控制台的输出是

<?xml version="1.0" encoding="ibm850"?><MyKey xmlns:msxsl="urn:schemas-microsoft
-com:xslt">MYNODE</MyKey>fooHeader