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>

但是如果将模板更改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
4

1 回答 1

1

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

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

于 2013-05-28T22:46:27.417 回答