Почему делает
<xsl:if test="<XPATH to boolean value here>">
...
</xsl:if>
ВСЕГДА возвращайте true?
Так как булевская переменная может быть 0,1, "ложь" и "верна" по определению, ЕДИНСТВЕННЫЙ способ протестировать на булево значение состоит в том, чтобы сделать сравнение строк против них. Это не может быть правильно.
Тест
, указанный в
, работает так, как если бы он вызывал логическую функцию
. Эта функция работает не так, как вы думаете. Если его аргумент оценивается как набор узлов (что будет, если вы используете путь в качестве аргумента), он вернет истину, если набор узлов не пуст, и ложь в противном случае. Таким образом, вы проверяете наличие элемента, а не его ценность. Если foo
содержит false
,
<xsl:if test="/path/to/foo">
всегда будет иметь значение true, поскольку в этом тесте вы действительно спрашиваете «существует ли этот элемент?» а не "истинно ли значение элемента?" И элемент существует.
Правило, согласно которому логические значения должны быть истинными
, ложными
, 1
или 0
, является частью схемы XML (, см. ), а не XPath, который ничего не знает об этом правиле. (XPath 1.0, то есть XPath 2.0 / XQuery 1.0 имеет функцию fn: boolean
, которая выполняет умную оценку логических значений с учетом схемы XML.) значение истинно в XSLT, вы должны явно проверить его:
<xsl:if test="/path/to/foo = 'true' or /path/to/foo = '1'">