我正在设置一个变量,如下所示..
<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
变量是否可以访问...
由于我已更新帖子
答案 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 变量一次。