选择声明弄乱我的变量?

时间:2009-06-23 21:30:00

标签: xslt variables

我有一个应该设置我的变量的选择语句,但由于某种原因,代码虽然在其他地方有用,但在这个实例中不起作用。

这是我的XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:param name="url-show"/>
<xsl:param name="url-min"/>
<xsl:param name="url-max"/>

<xsl:template match="data">

<xsl:variable name="show" select="$url-show"/>
<xsl:choose>
    <!-- With Min/Max -->
    <xsl:when test="$url-min != '' and $url-max != ''">
        <xsl:variable name="total" select="timeshare-search-results/pagination/@total-entries"/>
    </xsl:when>
    <!-- Without Min/Max -->
    <xsl:otherwise>
        <xsl:variable name="total" select="timeshare-listings/pagination/@total-entries"/>
    </xsl:otherwise>
</xsl:choose>
<xsl:variable name="default" select="$increment"/>
<xsl:choose>
    <!-- With Show Variable -->
    <xsl:when test="$show != ''">
        <xsl:if test="$show &lt; $total or $show = $total">
            <!-- stuff -->
        </xsl:if>
    </xsl:when>
    <!-- Without Show Variable -->
    <xsl:otherwise>
        <xsl:if test="$default &lt; $total or $default = $total">
            <!-- stuff -->
        </xsl:if>
    </xsl:otherwise>
</xsl:choose>

</xsl:template>

</xsl:stylesheet>

我删掉了非必要位。有趣的是,当我只有一个变量或另一个变量时,它们工作得很好。问题是,它们没有显示相同的数据,因此我需要根据两个URL参数选择一个或另一个。

事情是,我在这个同一页上的其他地方这样做 - 尽管我为这个例子修剪了它 - 它完美地运行了!

为什么不在这种情况下工作?有没有办法解决它?

1 个答案:

答案 0 :(得分:4)

变量在XSLT中是不可变的,从实例化到父元素的结尾,它们的作用域是可见的。

<xsl:when ...>
    <xsl:variable ...>
</xsl:when>

将变量范围限定为<xsl:when>块。如果在 <xsl:choose>块之前有一个名称​​定义的变量,那么当块过去时它将显示为“已恢复”,因为它不再被遮蔽。

设置变量的正确方法是将<xsl:variable>定义包围在 <xsl:choose>块中,如下所示:

<xsl:variable name="total">
    <xsl:choose>
        <!-- With Min/Max -->
        <xsl:when test="$url-min != '' and $url-max != ''">
            <xsl:value-of select="timeshare-search-results/pagination/@total-entries"/>
        </xsl:when>
        <!-- Without Min/Max -->
        <xsl:otherwise>
            <xsl:value-of select="timeshare-listings/pagination/@total-entries"/>
        </xsl:otherwise>
    </xsl:choose>
</xsl:variable>

现在,$total的范围将限定为<xsl:variable>块的父级,即<xsl:template match="data">块。