протестируйте = “” на булевской переменной, всегда возвращает true

Почему делает

<xsl:if test="<XPATH to boolean value here>">
...
</xsl:if>

ВСЕГДА возвращайте true?

Так как булевская переменная может быть 0,1, "ложь" и "верна" по определению, ЕДИНСТВЕННЫЙ способ протестировать на булево значение состоит в том, чтобы сделать сравнение строк против них. Это не может быть правильно.

6
задан Brian Johnson 3 June 2010 в 20:10
поделиться

2 ответа

Тест , указанный в , работает так, как если бы он вызывал логическую функцию . Эта функция работает не так, как вы думаете. Если его аргумент оценивается как набор узлов (что будет, если вы используете путь в качестве аргумента), он вернет истину, если набор узлов не пуст, и ложь в противном случае. Таким образом, вы проверяете наличие элемента, а не его ценность. Если 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'">
9
ответ дан 10 December 2019 в 02:43
поделиться

Здесь вы можете найти множество идей:

Пустой элемент

как проверить пустой элемент в XSL?

0
ответ дан 10 December 2019 в 02:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: