2

ここで、動的に作成された xml を C# コードで渡して xslt に param として渡し、そこから値を取得する必要があります。

以下はサンプルの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

ここで 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 には「Item」が含まれていますが、XSLT は「item」を探しています。これらのはずです

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

実際、ここで node-set は必要ないと思います。これもやってみる

<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 に答える