XQuery/FLWOR 表达式
外观
< XQuery
您有一系列项目,并且希望创建一个包含这些项目的报表。
我们将使用基本的 XQuery FLWOR 表达式来迭代序列中的每个项目。FLWOR 表达式的五个部分是
- for - 指定要选择序列中的哪些项目(可选)
- let - 用于创建在返回中使用的临时名称(可选)
- where - 限制返回的项目(可选)
- order - 更改结果的顺序(可选)
- return - 指定返回数据的结构(必需)
假设我们有一个书籍样本文件,如下所示
<books>
<book>
<title>Introduction to XQuery</title>
<description>A beginner's guide to XQuery that covers sequences and FLOWR expressions</description>
<type>softcover</type>
<sales-count>155</sales-count>
<price>19.95</price>
</book>
<book>
<title>Document Transformations with XQuery</title>
<description>How to transform complex documents like DocBook, TEI and DITA</description>
<type>hardcover</type>
<sales-count>105</sales-count>
<price>59.95</price>
</book>
<!-- ...more books here.... -->
</books>
这是一个简单的 FLWOR 表达式示例,它将仅返回按标题排序的书籍的标题和价格
for $book in doc("catalog.xml")/books/book
let $title := $book/title/text()
let $price := $book/price/text()
where xs:decimal($price) gt 50.00
order by $title
return
<book>
<title>{$title}</title>
<price>{$price}</price>
</book>
此 XQuery FLWOR 表达式将返回所有价格超过 50.00 美元的书籍。请注意,我们不仅有一个,而是有两个let语句在for循环之后。我们还添加了一个where子句来将结果限制在超过 50.00 美元的书籍上。结果按标题排序,结果是一个新的书籍项目序列,其中包含价格和标题。
您还可以通过在序列中的两个数字之间放置关键字“to”来表示从一个数字到另一个数字的值范围。
以下生成从 1 到 10 的值列表。
xquery version "1.0";
<list>
{for $i in (1 to 10)
return
<value>{$i}</value>
}
</list>
您可以添加“at $my-counter”以在 FLWOR 循环中的每个项目添加一个数字计数器
xquery version "1.0";
<items>
{
let $items := ("apples","pears","oranges")
for $item at $count in $items
return
<item id="{$count}">
{$item}
</item>
}
</items>
在命令式编程语言(JavaScript、Java、.Net、Perl、PHP 和 Python)中,每个循环都是按顺序执行的,一个接一个。但是 XQuery 是一种函数式编程语言。在 FLWOR 循环中,每次迭代都可以在并行执行,并且线程之间不允许通信。因此,您不能像在命令式语言中那样递增变量。