XSL:如何修改if语句中的变量

时间:2017-04-27 13:48:32

标签: xml xslt transformation

在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;
&#13;
&#13;

输出:

&#13;
&#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;
&#13;
&#13;

由于

的Matthias

1 个答案:

答案 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>