使用“every”子句

时间:2017-11-13 20:00:30

标签: xml xquery

我有以下Xquery:

let $x := <a>
           <i>false</i>
          </a>
return
    if (every $t in $x/a satisfies $t/i eq "true")
    then $x
    else <nothing/>

我如何理解这一点,如果所有$x的{​​{1}}都有一个单词“true”,则返回<a>。但是,这总是返回<i>

相反,如果我有以下XML文档:

$x

以及以下查询:

<root>
  <a><i>false</i></a>
</root>

for $x in /root return if (every $t in $x/a satisfies $t/i eq "true" ) then $x else <nothing/> 包含false时会返回<nothing/><i>为“true”时会返回$x

我的问题是:

  1. 为什么带“let”的查询的行为与它一样?
  2. 为什么带“for”的查询表现不同?

1 个答案:

答案 0 :(得分:5)

关键区别在于第二个例子中是否存在分配给$ x的根元素,而不是第一个。

在您的第一个示例中,根元素是<a>,但在您的量词表达式中,您可以编写every $t in $x/a$x/a选择a的子<a>元素,但没有{仅i。所以$x/a评估为空。表达式减少到every $t in () satisfies $t/i eq "true"。由于空被分配给$t,因此完整量词表达式的计算结果为真。