我有一个应该设置我的变量的选择语句,但由于某种原因,代码虽然在其他地方有用,但在这个实例中不起作用。
这是我的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 < $total or $show = $total">
<!-- stuff -->
</xsl:if>
</xsl:when>
<!-- Without Show Variable -->
<xsl:otherwise>
<xsl:if test="$default < $total or $default = $total">
<!-- stuff -->
</xsl:if>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
我删掉了非必要位。有趣的是,当我只有一个变量或另一个变量时,它们工作得很好。问题是,它们没有显示相同的数据,因此我需要根据两个URL参数选择一个或另一个。
事情是,我在这个同一页上的其他地方这样做 - 尽管我为这个例子修剪了它 - 它完美地运行了!
为什么不在这种情况下工作?有没有办法解决它?
答案 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">
块。