@DimitreNovatchev Привет, Димитр. Это решение, если логическое значение жестко запрограммировано в файле преобразования XSL. Есть изящное решение для falseи trueстрок , поступающих из файла, при преобразовании , что не включает в себя сравнение строк?
Джаггер
1
@Jagger, это уже другой вопрос. Этот вопрос задает вопрос « Как создать логическое значение » и получил свой точный ответ. Вы спрашиваете: « Как интерпретировать (или разобрать) определенные строки в логические значения » - это совершенно другой вопрос. Могу я спросить, что не так со сравнением строк?
Димитр Новачев
17
Используемая вами функция boolean () действительно выполняет свою работу. Для использования явных истинных и ложных значений следует использовать следующие функции:
Просто FYI, согласно документации MSDN , boolean () возвращает следующее:
Если аргумент является отрицательным или положительным числом, он преобразуется в логическое значение true.
Если аргумент равен нулю или имеет значение NaN, он преобразуется в false.
Если аргумент - непустой набор узлов, он преобразуется в истину. Пустой набор узлов преобразуется в ложное.
Если аргумент - непустая строка, он преобразуется в истину . Пустая строка преобразуется в ложь.
Если аргумент является объектом типа, отличного от четырех основных типов, он преобразуется в логическое значение способом, который зависит от этого типа.
Вам следует переформатировать предпоследний элемент вашего списка, чтобы выделяться больше, поскольку он является ключевым. "boolean ('')" также даст false.
Tomalak
2
@Tomalak, посмотри мой ответ. Это немного более подробно и цитирует истинный источник: спецификацию W3C XPath, а не "MSDN".
Димитр Новачев
1
@Dimitre: Я не думаю, что MSDN слишком сильно отклоняется от спецификации W3C в этом отношении. :) Но указывать там конечно вернее.
Tomalak
5
Возможно, на этом этапе немного поздно, но имо работа с логическими значениями просто не стоит усилий. Вот как я поступил с логическим (обязательным), возвращающимся из БД:
Ответы:
Значение переменной $ 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()"/>
источник
false
иtrue
строк , поступающих из файла, при преобразовании , что не включает в себя сравнение строк?Используемая вами функция boolean () действительно выполняет свою работу. Для использования явных истинных и ложных значений следует использовать следующие функции:
<xsl:variable name="var_false" select="false()"/> <xsl:variable name="var_true" select="true()"/>
Просто FYI, согласно документации MSDN , boolean () возвращает следующее:
источник
Возможно, на этом этапе немного поздно, но имо работа с логическими значениями просто не стоит усилий. Вот как я поступил с логическим (обязательным), возвращающимся из БД:
<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>
Надеюсь, это кому-то поможет
источник