如何声明返回节点集的用户定义函数?

Con*_*tin 4 .net xslt msxml

我想要这样的东西:

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

<xsl:for-each select="user:getNodes()">
    ...
</xsl:for-each>
Run Code Online (Sandbox Code Playgroud)

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

Boa*_*oaz 5

原则上您需要使用 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>
Run Code Online (Sandbox Code Playgroud)

但是,通常您希望在函数中做一些在 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>
Run Code Online (Sandbox Code Playgroud)

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