2010-06-08 44 views
1

考慮以下XSLT 2.0模板如何在XSLT中創建不是文檔片段的變量?

<xsl:template match="/"> 
    <xsl:variable name="var1"> 
     <elem>1</elem> 
     <elem>2</elem> 
     <elem>3</elem> 
    </xsl:variable> 
    <xsl:text>var1 has </xsl:text> 
    <xsl:value-of select="count($var1)"/> 
    <xsl:text>elements. 
    </xsl:text> 

    <xsl:variable name="var2" select="$var1/elem[position() &gt; 1]"/> 
    <xsl:text>var2 has </xsl:text> 
    <xsl:value-of select="count($var2)"/> 
    <xsl:text>elements. 
    </xsl:text> 
</xsl:template> 

此模板的輸出是

var1 has 1 elements 
var2 has 2 elements 

第一行輸出1(而不是如我第一預期3)因爲var1是一個文檔片段,其包含<elem>元素作爲孩子。現在我的問題:

如何創建一個不包含文檔片段的變量?我可以像做var2那樣做,只留下謂詞。但也許有一種方法不使用第二個變量。或者,作爲替代方案:如何在過濾掉某些元素的同時將文檔片段保留在變量中?

背景信息:我將在遞歸函數中使用變量內容,該函數檢查var1中的第一個元素是否符合某些條件。如果符合條件或元素列表爲空,則返回一個值。否則它會自動調用var1的第一個元素(像我在var2中那樣)。當使用var1作爲包含文檔片段的參數時,我的模板中的XPath表達式將不匹配。

+0

問得好(+1)。看到我的答案爲解決方案。 – 2010-06-08 13:41:16

回答

1

如何創建一個不包含文檔片段的變量 ?

用途:

<xsl:variable name="var1" as="element()*"> 
    <elem>1</elem> 
    <elem>2</elem> 
    <elem>3</elem> 
</xsl:variable> 

我如何保存文檔 片段在一個變量,同時過濾 一些元素?

如果您有:

<xsl:variable name="var1"> 
    <elem>1</elem> 
    <elem>2</elem> 
    <elem>3</elem> 
</xsl:variable> 

用途:

<xsl:variable name="var2"> 
    <xsl:copy-of select="$var1/*[. mod 2 = 1]"/> 
    </xsl:variable>