在xsl转换中我使用一堆if语句来响应xml文档中段的occourence。在这种情况下,for-each不适合。
每次if语句为true时,应将1添加到计数器(i_prop + 1),并将具有计数器值的segemnt添加到输出中。如下例所示
但它接缝可以在if语句中修改变量,但不能在" global"中修改。办法。在语句之后,变量具有if-statement的初始值。
有没有办法在下一个if语句中使用修改后的变量。 为什么xsl会做这种事情?
XSL_INPUT:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<!-- Create variable -->
<xsl:variable name="i_prop" select="0"/>
<test><xsl:value-of select="$i_prop"/></test>
<!-- +1 global -->
<xsl:variable name="i_prop" select="$i_prop + 1"/>
<test><xsl:value-of select="$i_prop"/></test>
<!-- +1 global -->
<xsl:variable name="i_prop" select="$i_prop + 1"/>
<test><xsl:value-of select="$i_prop"/></test>
<!-- +1 in if | FALSE -->
<xsl:if test="'A' = 'X'"><testif1><xsl:value-of select="$i_prop"/></testif1></xsl:if>
<!-- +1 in if | TRUE -->
<xsl:if test="'A' != 'X'"><xsl:variable name="i_prop" select="$i_prop + 1"/><testif2><xsl:value-of select="$i_prop"/></testif2></xsl:if>
<!-- +1 in if | TRUE -->
<xsl:if test="'A' != 'X'"><xsl:variable name="i_prop" select="$i_prop + 1"/><testif3><xsl:value-of select="$i_prop"/></testif3></xsl:if>
<!-- +1 global -->
<xsl:variable name="i_prop" select="$i_prop + 1"/>
<test><xsl:value-of select="$i_prop"/></test>
<!-- +1 in if | TRUE -->
<xsl:if test="'A' != 'X'"><xsl:variable name="i_prop" select="$i_prop + 1"/><testif4><xsl:value-of select="$i_prop"/></testif4></xsl:if>
<!-- +1 in if | TRUE -->
<xsl:if test="'A' != 'X'"><xsl:variable name="i_prop" select="$i_prop + 1"/><testif5><xsl:value-of select="$i_prop"/></testif5></xsl:if>
</xsl:template>
</xsl:stylesheet>
&#13;
输出:
<test>0</test>
<test>1</test>
<test>2</test>
<testif2>3</testif2>
<testif3>3</testif3>
<test>3</test>
<testif4>4</testif4>
<testif5>4</testif5>
expected:
<test>0</test>
<test>1</test>
<test>2</test>
<testif2>3</testif2>
<testif3>4</testif3>
<test>5</test>
<testif4>6</testif4>
<testif5>7</testif5>
&#13;
由于
的Matthias
答案 0 :(得分:2)
变量的范围限定为其父元素。当您在xsl:if
指令中重新定义(或更确切地说,覆盖)变量时,它仅存在于那里。当您返回顶层时,您将找到原始的全局变量,不变。
考虑以下样式表:
XSLT 2.0
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="/">
<results>
<!-- initial variable -->
<xsl:variable name="i_prop" select="0"/>
<test name="global">
<xsl:value-of select="$i_prop"/>
</test>
<!-- redefine -->
<xsl:variable name="i_prop" select="$i_prop + 1"/>
<test name="redefine-global">
<xsl:value-of select="$i_prop"/>
</test>
<!-- conditional redefine -->
<xsl:if test="true()">
<xsl:variable name="i_prop" select="$i_prop + 1"/>
<test name="scoped to xsl:if">
<xsl:value-of select="$i_prop"/>
</test>
</xsl:if>
<test name="back to global">
<xsl:value-of select="$i_prop"/>
</test>
</results>
</xsl:template>
</xsl:stylesheet>
<强>结果强>
<?xml version="1.0" encoding="UTF-8"?>
<results>
<test name="global">0</test>
<test name="redefine-global">1</test>
<test name="scoped to xsl:if">2</test>
<test name="back to global">1</test>
</results>