我想是這樣的:如何聲明一個返回節點集的用戶定義函數?
<msxsl:script language="C#">
??? getNodes() { ... return ... }
</msxsl:script>
<xsl:for-each select="user:getNodes()">
...
</xsl:for-each>
我應該使用什麼樣的返回類型getNodes()
和我應該放什麼東西在它的身上?
我想是這樣的:如何聲明一個返回節點集的用戶定義函數?
<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的快速谷歌顯示了以下頁面的鏈接,它提供了許多在Microsoft環境中擴展XSLT的示例。
http://msdn.microsoft.com/en-us/magazine/cc302079.aspx
具體的XSLT和.NET之間映射類型的部分給你正是你需要的信息:
W3C XPath的類型 - 等效.NET類(類型)
因此,在你的例子,我會嘗試XPathNodeLiterator。
+1投票部分答案。 – Constantin 2008-09-30 18:50:24