为什么不能在XSL模板选择器谓词中使用变量?

时间:2013-05-25 17:18:20

标签: php xslt-1.0

鉴于此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

1 个答案:

答案 0 :(得分:1)

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

为什么不呢?因为允许变量的声明包含对xsl:apply-templates的调用 - 所以允许模板匹配模式中的变量引用会使循环变量声明成为可能。