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'">