2011-02-07 42 views
2

通常事情的問題時,應XSLT上的原始XML文件工作,並設有一個樣式表。關於如何生成基於中間XSLT結果

但目前我的任務,我在我最後的XML文件中最後一個節點應該是一個數字,算在我的生成的XML文件中的某些類型的節點(不是原單)。

因此,例如,我最初的XML是空的,而在我的樣式表,我已經從其他一些地方抓住數據並插入他們進入這個空XML創建某些節點是這樣的:

<Plant> 
<Flower> 
    <Flower1>..</Flower1> 
    <Flower2>..</Flower2> 
</Flower> 

<Tree> 
    <Tree1>...</Tree1> 
    <Tree2>...</Tree2> 
</Tree> 

    .... 

<Counter>? </Counter> 
</Plant> 

我的問題是這個Counter節點,它應該是一個數字,表示在轉換後創建了多少個Plant的子節點。因此,我將假定一個兩步驟過程可能是有效的:第一步是做,抓住所有的「植物」的數據和填充在空的初始XML文件中的中間XSLT;然後第二步是對這個XML文件進行一個簡單的XPath計數,並附加另一個節點「Counter」來包含這個數字。但我不完全知道如何做連鎖這兩個XSLT文件到一個單一的XSLT(因爲一點擊需要變換),怎麼樣來代表中間XML文件和如何指揮IDE(XMLSpy的在我的情況)做另一個XSLT。

在此先感謝。

+0

問得好,+1。查看我的答案,瞭解多遍轉換的完整示例。 :) – 2011-02-07 18:05:44

回答

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「數據類型」。

+0

+1正確的答案。 – 2011-02-07 18:16:57