我想要这样的东西:
<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 msxml 的快速 google 显示了指向以下页面的链接,该链接提供了许多在 microsoft 环境中扩展 XSLT 的示例。
http://msdn.microsoft.com/en-us/magazine/cc302079.aspx
特别是 XSLT 和 .Net 之间的映射类型部分为您提供了所需的信息:
W3C XPath 类型 - 等效的 .NET 类(类型)
所以在你的例子中,我会尝试 XPathNodeLiterator。