2010-06-03 4 views
6

Почемутест = «» на логическое значение всегда возвращает истину

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

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

Поскольку boolean может быть 0,1, «false» и «true» по определению, ТОЛЬКО для проверки логического значения - это сравнение строк с ними. Это неправильно.

+0

Вы можете отправить текущее выражение XPath с помощью XML-фрагмента? –

+0

Это не вопрос. Пожалуйста, дайте конкретный пример - что такое выражение XPath и что такое XML-файл (как можно проще, пожалуйста), на котором оценивается это выражение XPath? –

+0

Предпочитаете видеть пример, я предполагаю, что в синтаксисе есть небольшая ошибка. –

ответ

8

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

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

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

Правило, логические значения должны быть true, false, 1 или 0 является частью схемы XML (which see), а не XPath, что ничего об этом правиле не знает. (XPath 1.0, то есть XPath 2.0/XQuery 1.0 имеет the fn:boolean function, который умеет, т. Е. Знает XML-схему, оценивает логические значения.) Чтобы определить, истинно ли значение в XSLT, вы должны явно его проверить:

<xsl:if test="/path/to/foo = 'true' or /path/to/foo = '1'"> 
+0

Если я правильно читаю http://www.w3.org/TR/xpath/#section-Boolean-Functions, между этими двумя тестами не должно быть разницы. На самом деле xsl: if задано для преобразования результата теста, как если бы вызов функции boolean. –

+0

Знаешь, я знал это. Исправленный. –

+0

В приведенном выше примере вы столкнетесь с проблемой, когда используете процессор, ориентированный на схему. Поскольку процессор знает из схемы, что/path/to/foo является xs: boolean, он выдает сообщение об ошибке «Невозможно сравнить xs: boolean to xs: string». У меня точно такая проблема (с логическим атрибутом) - и я действительно не знаю, как ее решить. Любая помощь? – 2011-05-11 17:04:59

0

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

Смежные вопросы