ノードセットを返すユーザー定義関数を宣言する方法は?

StackOverflow https://stackoverflow.com/questions/152822

  •  02-07-2019
  •  | 
  •  

質問

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

<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クラス(タイプ)

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top