私はこのようなものが欲しい:
<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 では不可能なことを関数で実行する必要があります。コードを通じてより適切に実装される基準、または何らかの外部データ構造に依存する基準。もう 1 つのオプションは、冗長な表現を単純化することです (以下の例のように)。次に、いくつかのパラメーターを 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 を試してみます。