2010-11-15 50 views
4

我有以下XSL樣式表:計數由<調用模板>返回元素的數量

<xsl:stylesheet xmlns="http://www.w3.org/1999/xhtml" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" encoding="utf-8"/> 

    <xsl:template match="/"> 
    <xsl:variable name="elements"> 
     <xsl:call-template name="get-some-nodes"/> 
    </xsl:variable> 

    <root> 
     <values> 
     <xsl:copy-of select="$elements"/> 
     </values> 
     <count> 
     <xsl:value-of select="count($elements)"/> 
     </count> 
    </root> 
    </xsl:template> 

    <xsl:template name="get-some-nodes"> 
    <node>1</node> 
    <node>2</node> 
    <node>3</node> 
    </xsl:template> 

</xsl:stylesheet> 

(它不應該不管你申請什麼XML它,它會生成自己的數據)。

的這本(使用xsltproc的)的結果是:

<?xml version="1.0" encoding="utf-8"?> 
<root xmlns="http://www.w3.org/1999/xhtml" xmlns:set="http://exslt.org/sets"> 
    <values> 
    <node>1</node> 
    <node>2</node> 
    <node>3</node> 
    </values> 
    <count>1</count> 
</root> 

鑑於所謂的模板返回三個節點,我希望「計數($元素)」爲3,但它是一個。我懷疑也許結果被包裝在某種根節點,但任何嘗試計數($ elements/*)或類似失敗,我相信因爲$元素是一個結果樹片段,而不是一個節點集。

我無法獲得exslt或xslt2.0的任何好東西,當然有一種方法可以獲得存儲在變量中的節點的數量嗎?

我也很樂意計算調用模板返回的節點而不使用中間變量,但我不明白這怎麼可能。

+0

好問題,1。請參閱我的答案以獲取詳細的解釋和解決方案 – 2010-11-15 23:29:23

回答

2
<xsl:variable name="elements"> 
    <xsl:call-template name="get-some-nodes"/> 
</xsl:variable> 

<root> 
    <values> 
    <xsl:copy-of select="$elements"/> 
    </values> 
    <count> 
    <xsl:value-of select="count($elements)"/> 
    </count> 
</root> 

在XSLT 1.0,每當節點被複制到一個<xsl:variable>的主體中,此變量的內容是一個RTF(結果-Tree_fragment)並且需要被轉換爲正則樹在用XPath進一步處理之前。

只能使用擴展函數(通常命名爲xxx:node-set())將RTF轉換爲常規樹,其中xxx前綴綁定到供應商特定的命名空間。

若要取得這棵樹的頂層元素的數量,您需要:

count(xxx:node-set($elements)/*) 

這裏有一些命名空間,到xxx:經常勢必

"http://exslt.org/common/" 

"urn:schemas-microsoft-com:xslt" 

在XSLT 2.0中,RTF「類型」不再存在,您可以只有

count($elements/*) 

如果未指定的$elements類型(默認爲document-node()

count($elements) 

如果$elements類型被指定爲element()*

+0

很好的答案,但我不認爲我有可用的節點集功能。我最終計劃將此作爲合併(atlassian的wiki產品)頁面進行部署,並且在實驗之後,它似乎不支持這些擴展。不幸的是,我正在尋找一種香草的XSLT 1解決方案。 – gfxmonk 2010-11-16 00:17:24

+0

@gfxmonk:您的XSLT處理器很可能具有* xxx:node-set()函數 - 大多數XSLT處理器都有。什麼是您使用的XSLT處理器?如果你不知道,從這個函數得到結果:'system-property(xsl:vendor)'或'system-property(xsl:vendor-url)'。 – 2010-11-16 02:06:13

+0

啊,這是一個很好的把戲知道。我正在使用Apache xalan-j。但是,我打算使用多個xslt處理器(xalan和libxslt)來運行此操作,因此我仍然非常喜歡不使用此類擴展的解決方案。 – gfxmonk 2010-11-16 03:03:00

相關問題