我想要这样的事情:
<msxsl:script language="C#">
??? getNodes() { ... return ... }
</msxsl:script>
<xsl:for-each select="user:getNodes()">
...
</xsl:for-each>
我应该为getNodes()
使用什么类型的返回类型以及我应该将其放入其中?
答案 0 :(得分:4)
原则上,您需要使用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>
希望这有帮助, 波阿斯
答案 1 :(得分:2)
快速google for C#xslt msxml显示了以下页面的链接,其中提供了许多在Microsoft环境中扩展XSLT的示例。
http://msdn.microsoft.com/en-us/magazine/cc302079.aspx
特别是XSLT和.Net之间的映射类型部分为您提供了所需的信息:
W3C XPath类型 - 等效的.NET类(类型)
所以在你的例子中我会尝试XPathNodeLiterator。