0

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

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);

第一列 Value 返回 true。其余的都返回 false。因此,在设法将值转换为正确的类型后,我如何实际检查它的值?

4

1 回答 1

1

你需要使用fn:false()orfalse()fn:true()ortrue()而不是只写trueor 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

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

于 2010-10-11T07:39:42.203 回答