我在这里修复,我必须通过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的值由于
这里有两个问题。首先,如何传递参数
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