.net下的XSLT转换 - 从XPath传递到节点没有任何价值

时间:2015-06-27 17:27:13

标签: .net xslt .net-4.0 msxml

所有

我正在使用.net 4.0和旧的弃用的XslTransform()类来执行xml命令到html输出的转换。 我有一个javascript函数,它在一个节点中传递,带有以下xpath表达式:

<xsl:value-of select="user:renderNode(//items/item/Comments[string-length(text()) > 0])" disable-output-escaping="yes"/>

我已经使用xpath工具验证了XPath表达式返回一个包含文本内容的节点。不幸的是,在javascript函数本身,当我说

return node.CurrentPosition;

return node.Current.InnerXml;

位置为0,InnerXml返回整个订单而不是我的文本选择。

这是C#代码:

var t = new XslTransform();
        t.Load("res/order.xsl");
        t.Transform("res/order.xml", "res/output.htm");


        string output;
        using (var reader = File.OpenText("res/output.htm"))
        {
            output = reader.ReadToEnd();
        }

和XSLT:

    <msxsl:script language="JScript" implements-prefix="user">
    <![CDATA[
        function renderNode(node) {
            return node.Current.InnerXml;

        }


    ]]>
</msxsl:script>

    <tr>
                    <td colspan="6">
                        <xsl:value-of select="user:renderNode(//items/item/Comments[string-length(text()) > 0])" disable-output-escaping="yes"/>
                    </td>
                </tr>

1 个答案:

答案 0 :(得分:1)

以下是使用XslTransform和.NET运行的示例,XSLT是

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:mf="http://example.com/mf" exclude-result-prefixes="msxsl mf"
>
  <xsl:output method="xml" indent="yes"/>

  <msxsl:script implements-prefix="mf" language="JScript">
  function foo(nodeIterator) {
    if (nodeIterator.MoveNext()) {
      return nodeIterator.Current.Value;
    }
    else return '';
  }
  </msxsl:script>

  <xsl:template match="/">
    <xsl:value-of select="mf:foo(root/item)"/>
  </xsl:template>
</xsl:stylesheet>

正如您在XSLT端看到的那样,root/item选择了一个节点集,并且在JScript函数内部接收并处理了XPathNodeIterator

输入XML

<root>
  <item>foo</item>
</root> 

该示例输出带有字符串值foo的结果文档片段。