跳轉到內容

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 迴圈中,每次迭代都可以在並行執行,並且執行緒之間不允許通訊。因此,您不能像在命令式語言中那樣遞增變數。

華夏公益教科書