Установите переменную на меньшее из двух других переменных - PullRequest
1 голос
/ 25 ноября 2008

Когда я пытаюсь использовать приведенный ниже код, я получаю двойную ошибку переменной, потому что переменные неизменны. Как установить меньшую из двух переменных ($nextSubPartPos и $nextQuestionStemPos) в качестве моей новой переменной ($nextQuestionPos)?

        <xsl:variable name="nextQuestionPos"/>
        <xsl:choose>
            <xsl:when test="$nextSubPartPos &lt; $nextQuestionStemPos">
                <xsl:variable name="nextQuestionPos" select="$nextSubPartPos"/>
            </xsl:when>
            <xsl:otherwise>
                <xsl:variable name="nextQuestionPos" select="$nextSubPartPos"/>
            </xsl:otherwise>
        </xsl:choose>

Ответы [ 4 ]

5 голосов
/ 26 ноября 2008

Компактное выражение XPath 1.0, которое оценивается в меньшее значение:

$ v1 * ($ v2> = $ v1) + $ v2 * ($ v1> $ v2)

где переменные $ v1 и $ v2 содержат сравниваемые значения.

Итак, элегантное однострочное решение XSLT 1.0 будет выглядеть так:

= $ v1) + $ v2 * ($ v1> $ v2)" />

Проще определить переменную в соответствии с требованиями XSLT 2.0:

Можно использовать следующие (более читабельные) однострочные:

if ($ v2 gt $ v1)
тогда $ v1
иначе $ v2

или более компактный:

мин (($ v1, $ v2))

3 голосов
/ 25 ноября 2008

Не закрывайте узел xsl: variable в первой строке. То есть вынуть / из него, затем поставить </xsl:variable> после </xsl:choose>. Затем измените узлы <xsl:variable> внутри выбора на <xsl:value-of> узлы.

То есть вы хотите установить значение переменной с помощью выбора. Есть два способа установить значение переменной. Один - это атрибут select, другой - внутренний текст узла.

<xsl:variable name="nextQuestionPos">
    <xsl:choose>
         <xsl:when test="$nextSubPartPos &lt; $nextQuestionStemPos">
               <xsl:value-of select="$nextSubPartPos"/>
         </xsl:when>
         <xsl:otherwise>
               <xsl:value-of select="$nextSubPartPos"/>
         </xsl:otherwise>
    </xsl:choose>
</xsl:variable>
2 голосов
/ 25 ноября 2008

Просто используйте функцию min:

<xsl:variable name="a" select="42" />
<xsl:variable name="b" select="23" />
<xsl:variable name="x" select="min(($a,$b))" />

В вашем примере замените весь код на:

<xsl:variable name="nextQuestionPos" select="min(($nextSubPartPos,$nextQuestionStemPos))" />

Saxon реализует min в глобальном пространстве имен. Для других процессоров может потребоваться пространство имен, правильное (обычно обозначаемое fn) - http://www.w3.org/2005/02/xpath-functions.

0 голосов
/ 25 ноября 2008

Переменные в XSLT неизменны. Это сбило меня с толку так много раз.

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