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


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

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

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

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

3 81

3 ответа:

значение переменной $VAR как определено в:

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

и

true()

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

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

true() и false()

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

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

  • число истинно тогда и только тогда, когда оно ни положительный или отрицательный нуль ни Нэн

  • набор узлов истинен тогда и только тогда, когда он есть непустой

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

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

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

поэтому, чтобы определить a переменная в 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()"/>

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

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

просто FYI, за Примечание, boolean () возвращает следующее:

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

немного поздно на этом этапе, возможно, но 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>

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