簡體   English   中英

如何聲明返回節點集的用戶定義函數?

[英]How to declare a user-defined function returning node-set?

我想要這樣的東西:

<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>

希望這有幫助,波阿斯

快速google for C#xslt msxml顯示了一個指向以下頁面的鏈接,該鏈接提供了許多在Microsoft環境中擴展XSLT的示例。

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

特別是XSLT和.Net之間的映射類型部分為您提供了所需的信息:

W3C XPath類型 - 等效的.NET類(類型)

  • String - System.String
  • Boolean - System.Boolean
  • Number - System.Double
  • 結果樹片段 - System.Xml.XPath.XPathNavigator
  • 節點集 - System.Xml.XPath.XPathNodeIterator

所以在你的例子中我會嘗試XPathNodeLiterator。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM