2013-05-25 70 views
0

鑑於此XML;爲什麼不能在XSL模板選擇器謂詞中使用變量?

<root> 
    <foo x='1'/> 
    <foo x='3'/> 
    <foo x='7'/> 
</root> 

and this stylesheet;

<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:template match="root"> 
    <result> 
     <xsl:apply-templates select="foo"/> 
    </result> 
    </xsl:template> 

    <xsl:template match="foo[@x > 2]"> 
    <xsl:copy-of select="."/> 
    </xsl:template> 

</xsl:transform> 

我得到想要的結果;

<result> 
    <bar x="3"/> 
    <bar x="7"/> 
</result> 

但是,如果模板爲matchfoo被改變到使用可變$i而不是恆定;

<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:variable name="i" select="2"/> 

    <xsl:template match="root"> 
    <result> 
     <xsl:apply-templates select="foo"/> 
    </result> 
    </xsl:template> 

    <xsl:template match="foo[@x > $i]"> 
    <xsl:copy-of select="."/> 
    </xsl:template> 

</xsl:transform> 

然後我得到這個錯誤;

XSLTProcessor::importStylesheet(): compilation error: Failed to compile predicate 

我做錯了什麼或不能使用變量嗎?

我曾嘗試以其他方式聲明變量,例如;

<xsl:variable name="i" select="2"/> 
    <xsl:variable name="i">2<xsl:variable> 

但它總是無法編譯樣式表。

我正在使用PHP XSL 1.0處理器libxslt;

PHP Version  5.3.2 
libxslt Version 1.1.23 

回答

1

不,變量不能在模板匹配模式(或xsl:key指令)中引用。

爲什麼不呢?因爲變量的聲明允許包含對xsl:apply-templates的調用 - 因此允許模板匹配模式中的變量引用會使循環變量聲明成爲可能。

+0

感謝您的澄清。 –