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

86

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

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

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

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

Сидлоуренс
источник
3
Просто предложение, но вы вполне можете получить более точный ответ, если напишете свой заголовок как правильный вопрос и избегаете лекций.
Уилл Дин

Ответы:

168

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

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

является

   true()

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

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

   true() а также false()

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

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

  • число истинно тогда и только тогда, когда оно не является ни положительным, ни отрицательным нулем, ни 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()"/>

Димитр Новачев
источник
@DimitreNovatchev Привет, Димитр. Это решение, если логическое значение жестко запрограммировано в файле преобразования XSL. Есть изящное решение для falseи trueстрок , поступающих из файла, при преобразовании , что не включает в себя сравнение строк?
Джаггер
1
@Jagger, это уже другой вопрос. Этот вопрос задает вопрос « Как создать логическое значение » и получил свой точный ответ. Вы спрашиваете: « Как интерпретировать (или разобрать) определенные строки в логические значения » - это совершенно другой вопрос. Могу я спросить, что не так со сравнением строк?
Димитр Новачев
17

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

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

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

  • Если аргумент является отрицательным или положительным числом, он преобразуется в логическое значение true.
  • Если аргумент равен нулю или имеет значение NaN, он преобразуется в false.
  • Если аргумент - непустой набор узлов, он преобразуется в истину. Пустой набор узлов преобразуется в ложное.
  • Если аргумент - непустая строка, он преобразуется в истину . Пустая строка преобразуется в ложь.
  • Если аргумент является объектом типа, отличного от четырех основных типов, он преобразуется в логическое значение способом, который зависит от этого типа.
Юваль Адам
источник
Вам следует переформатировать предпоследний элемент вашего списка, чтобы выделяться больше, поскольку он является ключевым. "boolean ('')" также даст false.
Tomalak
2
@Tomalak, посмотри мой ответ. Это немного более подробно и цитирует истинный источник: спецификацию W3C XPath, а не "MSDN".
Димитр Новачев
1
@Dimitre: Я не думаю, что MSDN слишком сильно отклоняется от спецификации W3C в этом отношении. :) Но указывать там конечно вернее.
Tomalak
5

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

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

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

outofcoolnames
источник