Выберите оператор, который испортил мою переменную? - PullRequest
1 голос
/ 24 июня 2009

У меня есть оператор выбора, который должен устанавливать мою переменную, но по какой-то причине код, хотя и работает в другом месте, в этом случае не работает.

Вот мой 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 Ответ

4 голосов
/ 24 июня 2009

Переменные являются неизменяемыми в 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">.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...