【问题标题】:How to declare a user-defined function returning node-set?如何声明返回节点集的用户定义函数?
【发布时间】:2008-09-30 12:29:57
【问题描述】:

我想要这样的东西:

<msxsl:script language="C#">
   ??? getNodes() { ... return ... }
</msxsl:script>

<xsl:for-each select="user:getNodes()">
    ...
</xsl:for-each>

getNodes() 应该使用什么返回类型,我应该在它的主体中放入什么?

【问题讨论】:

    标签: .net xslt msxml


    【解决方案1】:

    原则上,您需要使用 XPathNodeIterator 来返回节点集(如 Samjudson 所说)。我认为你给出的例子是一个退化的函数,因为你没有为它提供任何参数。然而,我认为看看你如何可以凭空制造节点是有启发性的。

    <msxsl:script language="C#">
       XPathNodeIterator getNodes() 
       { 
          XmlDocument doc = new XmlDocument();
          doc.PreserveWhitespace = true;
          doc.LoadXml("<root><fld>val</fld><fld>val2</fld></root>");
          return doc.CreateNavigator().Select("/root/fld");
       }
    </msxsl:script>
    

    但是,通常您会希望在函数中做一些在 xslt 中不可能的事情,例如根据某些标准过滤节点集。通过代码更好地实现或依赖于某些外部数据结构的标准。另一种选择是简化冗长的表达式(如下例所示)。然后你会将一些参数传递给你的 getNodes 函数。为简单起见,我使用基于 XPath 的过滤,但它可以是任何东西:

       <msxsl:script language="C#">
           XPathNodeIterator getNodes(XPathNodeIterator NodesToFilter, string Criteria)
          {
             XPathNodeIterator x = NodesToFilter.Current.Select("SOMEVERYCOMPLEXPATH["+Criteria+"]");
             return x;
          }
       </msxsl:script>
       <xsl:for-each select="user:getNodes(values/val,'SomeCriteria')">
        ...
      </xsl:for-each>
    

    希望这会有所帮助, 波阿斯

    【讨论】:

      【解决方案2】:

      对 C# xslt msxml 的快速 google 显示了指向以下页面的链接,该链接提供了许多在 microsoft 环境中扩展 XSLT 的示例。

      http://msdn.microsoft.com/en-us/magazine/cc302079.aspx

      XSLT 和 .Net 之间的映射类型部分特别为您提供了所需的信息:

      W3C XPath 类型 - 等效的 .NET 类(类型)

      • 字符串 - System.String
      • 布尔值 - System.Boolean
      • 数字 - System.Double
      • 结果树片段 - System.Xml.XPath.XPathNavigator
      • 节点集 - System.Xml.XPath.XPathNodeIterator

      所以在你的例子中我会尝试 XPathNodeLiterator。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-05-02
        • 2012-04-30
        • 2018-02-21
        • 2023-03-20
        • 2018-11-11
        • 2013-03-16
        • 2014-02-25
        相关资源
        最近更新 更多