Как создать логическое значение? - PullRequest
81 голосов
/ 06 декабря 2008

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

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

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

Оно всегда возвращает истину, когда подразумевается ложное. Почему?

Ответы [ 3 ]

164 голосов
/ 06 декабря 2008

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

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

это

true()

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

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

true() и false()

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

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

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

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

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

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

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

17 голосов
/ 06 декабря 2008

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

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

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

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

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

<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>

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

...