我想事情是这样的:

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

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

什么样的回报类型的我应该使用 getNodes() 和我应该怎么把它的身体吗?

有帮助吗?

解决方案

原则上,您需要使用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>

希望这有帮助, 波阿斯

其他提示

一个快速的谷歌C#xslt可以尝试下列任透露了一个链接到下面的网页,其中提供了许多例子中的延伸的XSLT在微软环境。

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

具体而言部分映类型之间的XSLT。净给你正是你所需要的信息:

W3C XPath类型等同的。净类别(类型)

  • 串系统。字符串
  • 布尔-系统。布尔
  • 数系统。双
  • 结果树片段的系统。Xml。XPath。XPathNavigator
  • 节点集系统。Xml。XPath。XPathNodeIterator

所以在你的例子,我会尝试XPathNodeLiterator.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top