在xsl中访问for循环之外的变量

时间:2014-02-03 07:55:04

标签: xslt xslt-1.0

我正在设置一个变量,如下所示..

<xsl:variable name="FoundFloating"> <xsl:value-of select="'no'" />
    </xsl:variable>

现在我正在进行一些处理,如下所示..

<xsl:if  test="$abcid=$def_id"> 
<xsl:for-each "$abcd">
                    <xsl:variable name="abcRate"> <xsl:value-of select="./def_Period/"/>
                    </xsl:variable>
                    <xsl:choose>
                        <xsl:when test="$abcdf !=$abcRate">
                        <xsl:variable name="$FoundFloating"> <xsl:value-of select="yes" />
                            </xsl:variable>
                        </xsl:when>
                        </xsl:choose>
            </xsl:for-each>

现在我正在评估这个xsl,如下所示。但我的查询是,{for循环的foundfloating变量是否可以访问,因为for循环已经结束..

<xsl:choose>
                <xsl:when test="$FoundFloating='yes'">  <xsl:value-of select="'AAA'" />
                </xsl:when>
                <xsl:otherwise>
                    <xsl:value-of select="'BBBA'" />
                </xsl:otherwise>
            </xsl:choose>

现在这个xsl之后我正在评估,如下所示..但我的问题是,{for}循环的foundfloating变量是否可以访问... 由于我已更新帖子

,请告知此事

1 个答案:

答案 0 :(得分:2)

首先要注意的是,变量在XSLT中是不可变的。这意味着一旦宣布,就无法改变。您的XSLT示例中实际发生的是您声明一个具有相同名称的全新变量。

您在for循环中声明的 FoundFloating 变量将无法在for循环外访问,因为它只在本地范围内。实际上,它只能在定义的xsl:when语句中访问。它是与您定义的全局变量不同的变量,并且只存在于循环中。

你真的不需要这里的循环。您可以将 xsl:for-each 中的条件和 xsl:when 中的条件合并为单个变量声明。

<xsl:if test="$abcid=$def_id"> 
   <xsl:variable name="FoundFloating">
      <xsl:if test="$abcd[def_Period != $abcdf]">yes</xsl:if>
   </xsl:variable>
   <xsl:choose>
       <xsl:when test="$FoundFloating='yes'">

(这完全取代了 xsl:for-each 语句)

事实上,只需将 FoundFloating 设置为节点本身(如果有),而不是“是”

,就可以进一步简化这一过程。
<xsl:if test="$abcid=$def_id"> 
   <xsl:variable name="FoundFloating" select="$abcd[def_Period != $abcdf]" />
   <xsl:choose>
      <xsl:when test="$FoundFloating">

这是有效的,因为测试的本质是某个节点是否与条件匹配。如果变量存在与否,则不将变量设置为“是”或“否”,而是将变量设置为节点本身。然后,如果它存在,则语句<xsl:when test="$FoundFloating">返回true,但如果不存在则返回false。

因此,您不需要 xsl:for-each 循环,而只需要声明 FoundFloating 变量一次。