谁能向我解释此查询的结果:

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。其余的全部返回false。因此,在设法将值投入正确的类型之后,我该如何实际检查其值?

有帮助吗?

解决方案

您需要使用 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 /> 元素。因此,只有常数的函数 truefalse, ,因为这是区分布尔常数和路径表达的唯一方法。

更详细的是,使用否定仍将返回 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

文字 falsetrue 两者都被评估为一个空的序列,该序列都不匹配布尔值 false() 也不是布尔价值 true().

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top