4

私はこのようなものが欲しい:

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

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

どの戻り値の型を使用する必要がgetNodes()あり、その本体に何を入れる必要がありますか?

4

2 に答える 2

5

原則として、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>

これが役に立てば幸いです、ボアズ

于 2009-01-05T18:16:51.413 に答える
2

C# xslt msxml を Google で検索すると、Microsoft 環境で XSLT を拡張する多くの例を示す次のページへのリンクが明らかになりました。

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

具体的には、XSLT と .Net の間の型のマッピングに関するセクションで、必要な情報が正確に得られます。

W3C XPath タイプ - 同等の .NET クラス (タイプ)

  • 文字列 - System.String
  • ブール値 - System.Boolean
  • 数値 - System.Double
  • 結果ツリーのフラグメント - System.Xml.XPath.XPathNavigator
  • ノード セット - System.Xml.XPath.XPathNodeIterator

あなたの例では、XPathNodeLiterator を試してみます。

于 2008-09-30T14:02:24.540 に答える