增加xslt中的变量

时间:2015-06-23 11:16:17

标签: xml xslt

我知道很多次都会问这个问题。我尝试了为这些问题提供的答案。它不适合我。我只想增加一个变量,如果提到两次属性值。我尝试了下面的方法,也没有用

    <xsl:variable name="counter" select="0" saxon:assignable="yes"/>
    <xsl:for-each select="//MARKER/*/*/*">
       <xsl:if test="contains(@Name,'Black' )">
        <saxon:assign name="counter" select="$counter+1"/>
        </xsl:if>
   </xsl:for-each>

在此之后,计数器的值也为零而不是2.任何人都可以建议我,如何实现这个

1 个答案:

答案 0 :(得分:4)

为什么不简单地计算您感兴趣的节点,例如

<xsl:value-of select="count(//MARKER/*/*/*[contains(@Name,'Black' )]"/>

加了:

  

谢谢它有效。但一般而言。我们如何增加变量?

通常,XSLT 1.0中的变量是不可变的。

Saxon 6.5以saxon:assignablesaxon:assign扩展名的形式提供规则的例外情况。如果您使用的是Saxon 6.5,您的尝试可能工作 - 请参阅此处的演示:http://xsltransform.net/94hvTzQ

严格地说,它应该那样工作,因为:

  1. xsl:for-each不是循环;
  2. xsl:for-each内部发生的事情超出了范围 不在其中的说明。
  3. 由于这些原因,尝试在XSLT 2.0中执行相同操作将失败 - 即使XSLT 2.0允许您重新分配变量 - 请参阅此处的演示:http://xsltransform.net/94hvTzQ/1

    正如您所看到的,xsl:for-each指令的每个实例都会将初始变量增加1,并且与其他实例无关 - 证明xsl:for-each不是一个循环。最后,由于上面的第二个原因,原始变量保持不变。