test = "" в логическом значении всегда возвращает true - PullRequest
6 голосов
/ 04 июня 2010

Почему

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

ВСЕГДА возвращать истину?

Поскольку логическое значение может быть 0,1, «ложь» и «истина» по определению, ЕДИНСТВЕННЫЙ способ проверить логическое значение - это сравнить строки с ними. Это не может быть правдой.

Ответы [ 3 ]

9 голосов
/ 04 июня 2010

test, указанное в <xsl:if>, работает так, как если бы оно вызывало функцию boolean. Эта функция работает не так, как вы думаете. Если его аргумент оценивается как набор узлов (который будет использоваться, если вы используете путь в качестве аргумента), он вернет true, если набор узлов не пустой, и false в противном случае. Таким образом, вы проверяете наличие элемента, а не его значение. Если foo содержит false,

<xsl:if test="/path/to/foo">

всегда будет иметь значение true, поскольку в этом тесте вы действительно спрашиваете: «существует ли этот элемент?» а не "верно ли значение элемента?" И элемент существует.

Правило, согласно которому логические значения должны быть true, false, 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'">
0 голосов
/ 01 июля 2015

Спецификация xpath дает булеву функцию. Таким образом, boolean (Value) всегда будет возвращать true или false.

0 голосов
/ 04 июня 2010

Вы можете найти целую кучу идей здесь:

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

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

...