我知道很多次都会问这个问题。我尝试了为这些问题提供的答案。它不适合我。我只想增加一个变量,如果提到两次属性值。我尝试了下面的方法,也没有用
<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.任何人都可以建议我,如何实现这个
答案 0 :(得分:4)
为什么不简单地计算您感兴趣的节点,例如
<xsl:value-of select="count(//MARKER/*/*/*[contains(@Name,'Black' )]"/>
谢谢它有效。但一般而言。我们如何增加变量?
通常,XSLT 1.0中的变量是不可变的。
Saxon 6.5以saxon:assignable
和saxon:assign
扩展名的形式提供规则的例外情况。如果您使用的是Saxon 6.5,您的尝试可能工作 - 请参阅此处的演示:http://xsltransform.net/94hvTzQ
严格地说,它应该不那样工作,因为:
xsl:for-each
不是循环; xsl:for-each
内部发生的事情超出了范围
不在其中的说明。由于这些原因,尝试在XSLT 2.0中执行相同操作将失败 - 即使XSLT 2.0允许您重新分配变量 - 请参阅此处的演示:http://xsltransform.net/94hvTzQ/1
正如您所看到的,xsl:for-each
指令的每个实例都会将初始变量增加1,并且与其他实例无关 - 证明xsl:for-each
不是一个循环。最后,由于上面的第二个原因,原始变量保持不变。