跳转到内容

XQuery/量化表达式

来自维基教科书,开放的书籍,开放的世界

您有一个序列中的项目列表,您想要测试以查看任何或所有项目是否匹配某个条件。对序列进行测试的结果将为真或假。

量化表达式与 FLWOR 表达式的格式非常相似,但有以下两点变化

  1. 您将使用 someevery 而不是 for
  2. 您将使用 satisfies 而不是 where/order/return

量化表达式始终以序列作为输入,并返回布尔值真/假作为输出。

以下是一个量化表达式的示例,它检查是否有任何书籍包含单词“cat”。

假设您有一组书籍,每本书都只有一个带有 title 属性的 XML 文件,例如:

<book>
   ...
   <title>The Cat With Nine Lives</title>
   ...
</book>

量化表达式的示例

[编辑 | 编辑源代码]

限制标题中包含字符串“cat”的书籍的 XQuery 表达式将是

测试集合中至少有一本“cat 书”

some $book in collection($collection)/book
satisfies (contains(lower-case($book/title), 'cat'))

只要有一本书的标题中包含单词“cat”,此表达式将返回真。

测试所有书籍都是猫书

every $book in collection($collection)/book
satisfies (contains(lower-case($book/title), 'cat'))

此表达式仅在所有书籍的标题中都包含字符串“cat”时才返回真。

请注意,量化表达式不能用于指示哪本书的标题包含单词“cat”,而只能指示单词“cat”是否出现在您的集合中的至少一个标题中。

量化表达式通常可以通过带谓词的单个 XPath 表达式重写。在上述情况下,表达式将是

let $has-a-cat-book := exists(collection($collection)/book/title[contains(lower-case(., 'cat')])

如果任何书籍包含单词“cat”,则变量 $has-a-cat-book 将设置为 true()。

一些 XQuery 解析器可以更好地优化量化表达式,有些人认为量化表达式比单个 XPath 表达式更易读。

华夏公益教科书