鉴于此XML;
<root>
<foo x='1'/>
<foo x='3'/>
<foo x='7'/>
</root>
和这个样式表;
<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>
但是,如果match
的模板foo
更改为使用变量$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
答案 0 :(得分:1)
不可以,模板匹配模式(或xsl:key指令)中不能引用变量。
为什么不呢?因为允许变量的声明包含对xsl:apply-templates的调用 - 所以允许模板匹配模式中的变量引用会使循环变量声明成为可能。