Во-первых, это немного зависит от того, поддерживает ли ваш запрос / процессор схему.(Существует ли объявление «схемы импорта»?)
Действующее логическое значение атрибута равно true, если атрибут существует, независимо от его значения и независимо от того, проверяются ли данные в схеме.И if (@married) ...
, и if (boolean(@married)) ...
проверяют действующее логическое значение.
Если вы хотите проверить, что атрибут существует и имеет значение 'true' или '1', используйте приведение: if (xs:boolean(@married)) ...
.Это будет работать независимо от того, введены данные или нет (путем проверки схемы).Обратите внимание на различие между функцией boolean()
(иногда пишется fn:boolean()
), которая получает эффективное логическое значение, и функцией xs:boolean()
cast или constructor, которая выполняет преобразование данных.
Если данныенетипизированный, вы можете использовать if (@married = 'true')
, но это приведет к ошибке типа, если данные введены как логические.Кроме того, он не проверяет все допустимые логические значения («истина», «1», «1» и т. Д.).
Если вы знаете, что данные были напечатаны с помощью проверки схемы, вы можете использоватьлюбой из следующих:
if (data(@married)) ...
, но нет реальной причины предпочитать это.
if (@married = true())
- выражение @married = true()
возвращает true, если атрибут существует и равен true, false, если он не существует или равен false
if (@married eq true())
- выражение @married eq true()
возвращает true, если атрибут существует и равен true, false, если он существует и false, ()
(пустая последовательность), если атрибут не существует;Эффект возврата ()
в контексте if()
аналогичен возвращению false.Использование «eq» вместо «=» может привести к небольшому выигрышу в производительности.
Если вы проверяете на ложность (опять-таки, предполагая, что введенные данные), различие между @married = false()
и @married eq false()
и @married != true()
и not(@married = true())
более тонкие.Если @married
не существует, то любое сравнение с использованием =
, eq
, !=
, ne
фактически ложно, независимо от того, является ли другой операнд true()
или false()
.Так что not(@married = true())
не означает то же самое, что (@married != true())
, и не означает то же самое, что (@married = false())
.
Я мог бы перейти к страницам об этом.В моей книге (Справочник программиста по XSLT 2.0 и XPath 2.0) я делаю именно это (см. Стр. 581–592).