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




html title (4)

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

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

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

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


Answers

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

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

является

true()

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

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

true() и false()

Деталь преобразования любого значения в boolean записывается в спецификации XPath :

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

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

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

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

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

В вашем случае строка «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()"/>


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

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

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

  • Если аргумент является отрицательным или положительным числом, он преобразуется в значение 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>

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


Вот реализация короткой передачи, if true .

# Function to test if a variable is set to "true"
_if () {
    [ "${1}" == "true" ] && return 0
    [ "${1}" == "True" ] && return 0
    [ "${1}" == "Yes" ] && return 0
    return 1
}

Пример 1

my_boolean=true

_if ${my_boolean} && {
    echo "True Is True"
} || {
    echo "False Is False"
}

Пример 2.

my_boolean=false
! _if ${my_boolean} && echo "Not True is True"




xml xslt boolean