2011-01-31 113 views
3

我現在到了我的XSL樣式表的最後一步,它需要我輸出一個數字,表示添加的節點總數。其實,它似乎並不那麼直截了當:如何統計XSLT中的節點?

首先,我不計算從原始xml文檔中的節點,我將從結果XML中計算某些節點(最初xml文件可能是空的)。

其次,我不算所有的節點。

例如,下面是一段我的XSLT代碼:

<xsl:template name="Loop2000A"> 
    <Loop2000A> 
<HL> 
    <HL01> 
    <xsl:value-of select="'1'"/> 
    </HL01> 
    <HL03> 
    <xsl:value-of select="'20'"/> 
    </HL03> 
</HL> 
<xsl:if test="$recbat//provider_taxonomy_qual !='' "> 
<PRV> 
<PRV01> 
    <xsl:value-of select="'BI'"/> 
</PRV01> 
    <PRV02> 
    <xsl:value-of select="$recbat//provider_taxonomy_qual"/> 
</PRV02> 
<PRV03> 
    <xsl:value-of select="$recbat//provider_taxonomy"/> 
</PRV03> 
    </PRV> 
    </xsl:if> 
<xsl:call-template name="Loop2010AA"/> 

因此,對於這個代碼,並稱爲段,而那些$ recbat等都是數據源。所以,我真正想要計算的是這些段的數量,它可以跨越不同的模板(如上面的「Loop2010AA」模板,這是另一個模板),並且這些段可能有循環,所以它們可以連續創建3次,我們的櫃檯應該相應地增加3,或者「if」聲明失敗,因此沒有創建這樣的分段,那麼櫃檯應該保持不變。

我不確定實現這個的正確方法,因爲我已經使用的大多數教程都是關於對原始XML文檔中的節點進行計數的。現在我有一個想法是使用參數傳遞,但我不知道如何使此參數成爲全局參數?

另外,我正在考慮一個更直接的方式來做到這一點。除了使用計數器變量之外,是否有任何方法可以首先生成輸出xml文檔,然後在此xml中計算我想要的節點,然後使用其中的數字生成TRUE輸出。

+0

有了完整的樣式表,人們可以用適當的函數`scan`模式來重構它。如果沒有樣式表,我只能建議一個兩階段轉換:將所有內容輸出到一個變量中,然後對節點進行計數。 – 2011-01-31 19:20:59

+0

@Alejandro:我實際上已經有了我的所有樣式表,並且通過使用(「calling-template」)將它們鏈接在一起。所以使用我應該看看掃描模式? – Kevin 2011-01-31 19:29:17

回答

3

這裏是處理的變換的結果,包括計數其節點一般的方式:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:ext="http://exslt.org/common" 
> 
<xsl:output method="text"/> 

<xsl:template match="node()|@*"> 
    <xsl:copy> 
    <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 

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

    <xsl:variable name="vPass2" select="ext:node-set($vrtfPass1)"/> 

    <xsl:value-of select="count($vPass2/*/*/*)"/> 
</xsl:template> 
</xsl:stylesheet> 

當這種轉變是在下面的XML文檔施加:

<nums> 
<num>1</num> 
<num>2</num> 
<num>3</num> 
<num>4</num> 
<num>5</num> 
</nums> 

正確結果產生

10 

在XSLT 1.0(僅)中,多通處理通常需要使用xxx:node-set()擴展函數。 XSLT 2.0中沒有這樣的要求,它消除了臭名昭着的RTF「數據類型」。