跳轉到內容

XQuery/分組項

來自華夏公益教科書,開放的書籍,開放的世界

您在一組資料中擁有許多與類別關聯的專案。您想要建立一個按類別對專案進行排序的報表。

我們將分三個步驟執行查詢。

  1. 使用 FLWOR 語句,使用 distinct-values() 函式建立不同類別的序列。
  2. 對於類別序列中的每個專案,選擇屬於該類別的所有專案。這可以透過在 XPath 選擇器末尾新增謂詞(where 子句)來完成。它的形式為 data/item[x=y],如果 x=y 返回 true,則該專案將被新增到序列中。
  3. 對於 FLWOR 語句中的每個結果集,返回類別名稱,然後返回該類別中的所有專案。

示例資料

[編輯 | 編輯原始碼]
<items>
    <item>
        <name>item #1</name>
        <category>red</category>
    </item>
 <item>
        <name>item #1</name>
        <category>red</category>
    </item>
    <item>
        <name>item #2</name>
        <category>green</category>
    </item>
    <item>
        <name>item #3</name>
        <category>red</category>
    </item>
    <item>
        <name>item #4</name>
        <category>blue</category>
    </item>
    <item>
        <name>item #5</name>
        <category>red</category>
    </item>
    <item>
        <name>item #6</name>
        <category>blue</category>
    </item>
    <item>
        <name>item #7</name>
        <category>green</category>
    </item>
    <item>
        <name>item #8</name>
        <category>red</category>
    </item>
</items>

示例查詢

[編輯 | 編輯原始碼]

以下 XQuery 將演示此技術。請注意,所有類別的不同值儲存在 $distinct-categories 變數中。

xquery version "1.0";
declare option exist:serialize "method=xhtml media-type=text/html";

(: load the items :)
let $data := doc('/db/mdr/apps/training/labs/04-group-by/data.xml')/items

let $distinct-categories := distinct-values($data/item/category/text())

return
<html>
  <body>
     <table border="1">
        <thead>
           <tr>
              <th>Category</th>
              <th>Items</th>
           </tr>
        </thead>
        <tbody>
        {
        for $category in $distinct-categories
        return
           <tr>
              <td>{$category}</td>
              <td>{string-join($data/item[category=$category]/name/text(), ', ')}</td>
           </tr>
        }
        </tbody>
     </table>
  </body>
</html>

在上面的查詢中,語句

  $data/item[category=$category]

表示“從資料集中獲取所有類別元素等於當前類別的專案。”

string-join() 函式只是在輸出流中的專案之間放置一個逗號和一個空格字串,以便於閱讀。

示例輸出

[編輯 | 編輯原始碼]
類別 專案
紅色 專案 #1,專案 #3,專案 #5,專案 #8
綠色 專案 #2,專案 #7
藍色 專案 #4,專案 #6

請注意,您不受限於將專案置於單個類別中。將多個類別新增到專案中不需要對指令碼進行任何更改。

您也可以隨時將新類別新增到此列表中,而無需更改上面的程式。只要類別元素存在範圍索引,所有類別的列表就會很快建立,即使對於數百萬條記錄也是如此。

華夏公益教科書