Как создать логическое значение?

Я совершенно не знаком с XSLT и не могу решить, где я ошибаюсь в следующем коде.

<xsl:variable name="var" select="boolean('false')"/>

<xsl:if test="$var'">variable is true</xsl:if>

Он всегда возвращает true, когда он должен быть ложным. Почему?

Ответ 1

Значение переменной $var, как определено в:

    <xsl:variable name="var" select="boolean('false')"/>

есть

    true()

Это потому, что в XPath "false" является обычной строкой, а не false(), которая является конструктором для значения boolean false()

Два булевых значения в XPath (обратите внимание, что они построены!):

    true() и false()

Детали преобразования любого значения в boolean записываются в XPath Spec.:

"Функция boolean преобразует свой аргумент в логическое значение следующим образом:

  • число истинно тогда и только тогда, когда оно не является ни положительным, ни отрицательным нулем ни NaN

  • a node -set истинно тогда и только тогда, когда оно непустое

  • строка истинна тогда и только тогда, когда ее длина не равна нулю

  • объект типа, отличный от четырех основных типов, преобразуется в логическое значение таким образом, который зависит от этого типа "

В вашем случае строка "false" не является числом 0 и имеет положительную длину, поэтому применяется правило в 3-м марке выше, что дает true().

Следовательно, для определения переменной в XSLT 1.0, значение которой false(), нужно написать определение следующим образом:

    <xsl:variable name="vMyVar" select="false()"/>

или, если вы точно не помните это, вы всегда можете написать:

    <xsl:variable name="vMyVar" select="1 = 0"/>

(укажите любое выражение, которое оценивается как false()), и процессор XSLT выполнит вашу работу.

В XSLT 2.0 всегда лучше явно указать тип переменной:

    <xsl:variable name="vMyVar" as="xs:boolean" select="false()"/>

Ответ 2

Функция boolean(), которую вы используете, действительно выполняет эту работу. Для использования явных значений true и false вы должны использовать следующие функции:

<xsl:variable name="var_false" select="false()"/>
<xsl:variable name="var_true" select="true()"/>

Просто FYI, за документация MSDN, boolean() возвращает следующее:

  • Если аргумент является отрицательным или положительным числом, он преобразуется в значение Boolean true.
  • Если аргумент равен нулю или значение NaN, оно преобразуется в значение false.
  • Если аргумент является непустым node -set, он преобразуется в значение true. Пустой набор node преобразуется в значение false.
  • Если аргумент является непустой строкой, он преобразуется в true. Пустая строка преобразуется в значение false.
  • Если аргумент является объектом типа, отличного от четырех основных типов, он преобразуется в логическое значение таким образом, который зависит от этого типа.

Ответ 3

Немного поздно на этом этапе, возможно, но imo, связанный с булевыми, просто не стоит усилий. Вот как я справился с логическим (обязательным) возвратом из БД:

<xsl:variable name="vTrue" select="true()"/>                     
    <xsl:choose>
      <xsl:when test="string(Mandatory) = string($vTrue)">
        <xsl:text>Mandatory</xsl:text>
      </xsl:when>
      <xsl:otherwise>           
      </xsl:otherwise>
    </xsl:choose>

Надеюсь, это поможет кому-то