Вопрос

Кто -нибудь может объяснить мне результаты этого запроса:

declare @xml xml;
set @xml = '<node attribute="true">Val</node>';

select
    T.c.query('xs:boolean(@attribute[1])') Value,
    T.c.query('xs:boolean(@attribute[1]) = false') ValueEqualsFalse,
    T.c.query('xs:boolean(@attribute[1]) = true') ValueEqualsTrue,
    T.c.query('xs:boolean(@attribute[1]) != false') ValueNotEqualsFalse,
    T.c.query('xs:boolean(@attribute[1]) != true') ValueNotEqualsTrue
from @Xml.nodes('node') T(c);

Первый столбец, значение, возвращает true. Остальные все возвращают ложь. Итак, удавлюсь отбросить значение правильному типу, как я действительно проверю его значение?

Это было полезно?

Решение

вам нужно использовать fn:false() или false() и fn:true() или true() вместо того, чтобы просто писать true или false.

Это правильный пример:

T.c.query('xs:boolean(@attribute[1]) = false()') ValueEqualsFalse,
T.c.query('xs:boolean(@attribute[1]) = true()') ValueEqualsTrue,
T.c.query('xs:boolean(@attribute[1]) != false()') ValueNotEqualsFalse,
T.c.query('xs:boolean(@attribute[1]) != true()') ValueNotEqualsTrue

Если вы не используете функцию false(), false обрабатывается как выражение пути, то есть процессор считает, что вы запрашиваете для <false /> элемент. Следовательно, существует только функция для констант true и false, Поскольку это единственный способ различать логические константы и выражением пути.

Более подробно, использование отрицания все равно вернется false в каждом примере.

Это не то, что вы хотите (просто чтобы продемонстрировать):

T.c.query('not(xs:boolean(@attribute[1])) = false') ValueEqualsFalse,
T.c.query('not(xs:boolean(@attribute[1])) = true') ValueEqualsTrue,
T.c.query('not(xs:boolean(@attribute[1])) != false') ValueNotEqualsFalse,
T.c.query('not(xs:boolean(@attribute[1])) != true') ValueNotEqualsTrue

Литералы false и true Оба оцениваются с пустой последовательностью, которая не соответствует логичному значению false() ни логическое значение true().

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top