




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