XQuery/分組項
外觀
< XQuery
您在一組資料中擁有許多與類別關聯的專案。您想要建立一個按類別對專案進行排序的報表。
我們將分三個步驟執行查詢。
- 使用 FLWOR 語句,使用 distinct-values() 函式建立不同類別的序列。
- 對於類別序列中的每個專案,選擇屬於該類別的所有專案。這可以透過在 XPath 選擇器末尾新增謂詞(where 子句)來完成。它的形式為 data/item[x=y],如果 x=y 返回 true,則該專案將被新增到序列中。
- 對於 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 |
請注意,您不受限於將專案置於單個類別中。將多個類別新增到專案中不需要對指令碼進行任何更改。
您也可以隨時將新類別新增到此列表中,而無需更改上面的程式。只要類別元素存在範圍索引,所有類別的列表就會很快建立,即使對於數百萬條記錄也是如此。