2

我在这里进行了修复,我必须将 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 的值谢谢

4

2 回答 2

2

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

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 包含“项目”,但 XSLT 正在寻找“项目”。应该是这些

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

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

<xsl:value-of select="$Keys/Keys/Item/Header"/> 
于 2014-06-26T08:09:14.727 回答
1

一旦你用

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
于 2014-06-26T09:17:45.350 回答