Я совершенно новичок в XSLT и не могу понять, где я ошибаюсь со следующим кодом.
<xsl:variable name="var" select="boolean('false')"/>
<xsl:if test="$var'">variable is true</xsl:if>
Он всегда возвращает истину, когда должен быть ложью. Зачем?
Я совершенно новичок в XSLT и не могу понять, где я ошибаюсь со следующим кодом.
<xsl:variable name="var" select="boolean('false')"/>
<xsl:if test="$var'">variable is true</xsl:if>
Он всегда возвращает истину, когда должен быть ложью. Зачем?
Ответы:
Значение переменной $ 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>
Надеюсь, это кому-то поможет