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


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>

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.