跳转到内容

XQuery/FLWOR 表达式

来自 Wikibooks,开放世界中的开放书籍

您有一系列项目,并且希望创建一个包含这些项目的报表。

我们将使用基本的 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>

(存储在 eXistdb 中)

这是一个简单的 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”函数生成一系列值

[编辑 | 编辑源代码]

您还可以通过在序列中的两个数字之间放置关键字“to”来表示从一个数字到另一个数字的值范围。

以下生成从 1 到 10 的值列表。

xquery version "1.0";
<list>
   {for $i in (1 to 10)
      return
        <value>{$i}</value>
    }
</list>

执行

使用“at”函数作为计数器

[编辑 | 编辑源代码]

您可以添加“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>

执行

比较 FLWOR 与命令式for循环

[编辑 | 编辑源代码]

命令式编程语言(JavaScript、Java、.Net、Perl、PHP 和 Python)中,每个循环都是按顺序执行的,一个接一个。但是 XQuery 是一种函数式编程语言。在 FLWOR 循环中,每次迭代都可以在并行执行,并且线程之间不允许通信。因此,您不能像在命令式语言中那样递增变量。

华夏公益教科书