XQuery/量化表达式
外观
< XQuery
您有一个序列中的项目列表,您想要测试以查看任何或所有项目是否匹配某个条件。对序列进行测试的结果将为真或假。
量化表达式与 FLWOR 表达式的格式非常相似,但有以下两点变化
- 您将使用 some 或 every 而不是 for
- 您将使用 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 表达式更易读。