Я совершенно не знаком с XSLT и не могу решить, где я ошибаюсь в следующем коде.
<xsl:variable name="var" select="boolean('false')"/>
<xsl:if test="$var'">variable is true</xsl:if>
Он всегда возвращает true, когда он должен быть ложным. Почему?
Я совершенно не знаком с XSLT и не могу решить, где я ошибаюсь в следующем коде.
<xsl:variable name="var" select="boolean('false')"/>
<xsl:if test="$var'">variable is true</xsl:if>
Он всегда возвращает true, когда он должен быть ложным. Почему?
Значение переменной $var, как определено в:
<xsl:variable name="var" select="boolean('false')"/>
есть
true()
Это потому, что в XPath "false
" является обычной строкой, а не false()
, которая является конструктором для значения boolean
false()
Два булевых значения в XPath (обратите внимание, что они построены!):
true()
и false()
Детали преобразования любого значения в boolean записываются в XPath Spec.:
"Функция boolean преобразует свой аргумент в логическое значение следующим образом:
число истинно тогда и только тогда, когда оно не является ни положительным, ни отрицательным нулем ни NaN
a node -set истинно тогда и только тогда, когда оно непустое
строка истинна тогда и только тогда, когда ее длина не равна нулю
объект типа, отличный от четырех основных типов, преобразуется в логическое значение таким образом, который зависит от этого типа "
В вашем случае строка "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()"/>
Функция boolean(), которую вы используете, действительно выполняет эту работу. Для использования явных значений true и false вы должны использовать следующие функции:
<xsl:variable name="var_false" select="false()"/>
<xsl:variable name="var_true" select="true()"/>
Просто FYI, за документация MSDN, boolean() возвращает следующее:
Немного поздно на этом этапе, возможно, но imo, связанный с булевыми, просто не стоит усилий. Вот как я справился с логическим (обязательным) возвратом из БД:
<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>
Надеюсь, это поможет кому-то