2013-03-20 59 views
1

我正在嘗試計算我的轉換生成的元素(必須使用XLST1)。例如,我的轉換創建:計算在XSLT1中生成的元素

<Parent> 
    <ElementX Att1="2"/> 
    <ElementY Att1="1"/> 
    <ElementZ Att1="6"/> 
</Parent> 

我需要在同一改造內打印3,因爲有3個元素。

可以這樣做嗎?

謝謝。

+0

那麼你的轉型是什麼樣子? – JLRishe 2013-03-20 15:22:24

+0

請修改您的帖子以包含整個模板,並至少包含調用該模板的模板。 – JLRishe 2013-03-20 15:35:13

回答

0

如果您提供了一些XSLT的提取,這將有很大的幫助。 我不給它一個XSLT代碼。我將嘗試給出一些「方法」來回答:

一種解決方案可能是將輸出存儲到nodeset(使用提供nodeset()函數的XSLT 1.0擴展)並應用XPath count()函數在這個變量上。之後,只需使用xsl:value-of輸出變量,並以相同的方式計算結果。

0

這裏是一個演示如何做到這一點

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:ext="http://exslt.org/common" exclude-result-prefixes="ext"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 

<xsl:template match="/"> 
    <xsl:variable name="vrtfPass1"> 
    <xsl:apply-templates/> 
    </xsl:variable> 

    <xsl:value-of select="count(ext:node-set($vrtfPass1)/*/*)"/> 
</xsl:template> 

<xsl:template match="/*"> 
    <Parent> 
     <ElementX Att1="2"/> 
     <ElementY Att1="1"/> 
     <ElementZ Att1="6"/> 
    </Parent> 
</xsl:template> 
</xsl:stylesheet> 

當這種轉變是在任何XML文檔(在此演示沒有使用),想要的,正確的結果是產生應用:

3 

說明

處理變換結果(在單個變換中)的一般方法是將它組織成,兩次傳入,我們將第一次傳遞的結果保存在變量中。

在第二步中,我們訪問結果並執行附加處理。

請注意,在XSLT 1.0中,如果捕獲第一遍結果的變量是臭名昭着的RTF(結果樹片段)類型,並且需要按照此樹中的任何節點的順序轉換爲常規樹可以訪問(xsl:copy-ofstring()仍然可以在RTF上使用)。

此轉換爲常規樹由擴展函數完成,擴展函數通常具有名稱node-set並始終屬於供應商定義的名稱空間。在這個演示中,我們使用屬於EXSLT命名空間的node-set()擴展函數 - 因爲大多數XSLT 1.0處理器都實現EXSLT。

有關多通道處理的詳細信息,請參閱本Two phase processing: Do not output empty tags from phase-1 XSLT 2.0 processing