XQuery 是 XML 資料的查詢語言,類似於 SQL 是資料庫的查詢語言。它被設計用於查詢 XML 資料。
XQuery 示例
for $x in doc("books.xml")/bookstore/book
where $x/price > 30
order by $x/title
return $x/title
XQuery 的特點
- XQuery 是查詢 XML 資料的語言,用於 XML 就像 SQL 用於資料庫一樣。
- 它是基於 XPath 表示式構建的
- 它是一種從 XML 文件中查詢和提取元素和屬性的語言。
XQuery 和 XPath
XQuery 1.0 和 XPath 2.0 共享相同的資料模型,並支援相同的函式和運算子。因此,如果您已經學習了 XPath,那麼理解 XQuery 就不會有太大問題。
XQuery 的應用
XQuery 可用於以下情況:
- 提取資訊以用於 Web 服務
- 生成摘要報告
- 將 XML 資料轉換為 XHTML
- 搜尋 Web 文件以獲取相關資訊
XQuery 示例
讓我們透過看一個示例學習一些基本的 XQuery。
XML 示例文件
我們將在下面的示例中使用以下 XML 文件 "books.xml":
<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
<book category="COOKING">
<title lang="en">Everyday Italian</title>
<author>Giada De Laurentiis</author>
<year>2005</year>
<price>30.00</price>
</book>
<!-- 其他書籍 -->
</bookstore>
如何從 "books.xml" 中選擇節點?
XQuery 使用函式和路徑表示式來從 XML 文件中提取資料。
函式
使用 doc()
函式來開啟 "books.xml" 檔案:
doc("books.xml")
路徑表示式
使用路徑表示式來導航 XML 元素:
doc("books.xml")/bookstore/book/title
上面的路徑表示式選擇了 "books.xml" 檔案中的所有 title 元素。
謂詞
使用謂詞來限制從 XML 文件中提取的資料:
doc("books.xml")/bookstore/book[price<30]
上面的 XQuery 將提取價格小於 30 的所有書籍。
總結
XQuery 是一種強大的 XML 查詢語言,可用於在 XML 文件中查詢和提取資訊
XQuery FLWOR 表示式
什麼是 FLWOR
FLWOR 是一個縮寫,代表 "For, Let, Where, Order by, Return",它是一種用於在 XQuery 中進行資料處理的表示式。
- For:選擇一系列節點。
- Let:將一個序列繫結到一個變數。
- Where:過濾節點。
- Order by:對節點排序。
- Return:返回結果(對每個節點進行一次評估)。
如何使用 FLWOR 從 "books.xml" 中選擇節點?
考慮以下路徑表示式:
doc("books.xml")/bookstore/book[price>30]/title
上面的表示式選擇了 bookstore 元素下的 book 元素中,其 price 元素的值高於 30 的所有 title 元素。
以下 FLWOR 表示式將選擇與上面的路徑表示式完全相同的結果:
for $x in doc("books.xml")/bookstore/book
where $x/price>30
return $x/title
結果將是
<title lang="en">XQuery Kick Start</title>
<title lang="en">Learning XML</title>
使用 FLWOR,您可以對結果進行排序:
for $x in doc("books.xml")/bookstore/book
where $x/price>30
order by $x/title
return $x/title
XQuery FLWOR + HTML
將結果顯示為 HTML 列表
考慮以下 XQuery FLWOR 表示式:
<ul>
{
for $x in doc("books.xml")/bookstore/book/title
order by $x
return <li>{$x}</li>
}
</ul>
上面的表示式選擇了 bookstore 元素下的 book 元素中的所有 title 元素,並按字母順序返回 title 元素。
現在我們想要在我們的書店中將所有書名列成一個 HTML 列表。我們在 FLWOR 表示式中新增了 <ul>
和 <li>
標籤:
<ul>
{
for $x in doc("books.xml")/bookstore/book/title
order by $x
return <li>{$x}</li>
}
</ul>
現在我們想要消除 title 元素,並只顯示 title 元素內的資料:
<ul>
{
for $x in doc("books.xml")/bookstore/book/title
order by $x
return <li>{data($x)}</li>
}
</ul>
結果將是一個 HTML 列表,顯示了書籍的名稱。
XQuery 術語
- 節點:在 XQuery 中,有七種型別的節點:元素、屬性、文字、名稱空間、處理指令、註釋和文件(根)節點。
- 原子值:沒有子節點或父節點的節點。
- 專案:原子值或節點。
- 節點的關係:父節點、子節點、兄弟節點、祖先節點和後代節點。
XQuery 語法
XQuery 基本語法規則
XQuery 是區分大小寫的,同時要求元素、屬性和變數必須是有效的 XML 名稱。
- XQuery 區分大小寫。
- XQuery 元素、屬性和變數必須是有效的 XML 名稱。
- XQuery 字串值可以使用單引號或雙引號括起來。
- XQuery 變數以
$
開頭,後跟一個名稱,例如$bookstore
。 - XQuery 註釋使用
(:
和:)
進行界定,例如(: XQuery 註釋 :)
。
XQuery 條件表示式
XQuery 支援使用 "If-Then-Else" 表示式。
示例
for $x in doc("books.xml")/bookstore/book
return if ($x/@category="children")
then <child>{data($x/title)}</child>
else <adult>{data($x/title)}</adult>
在上述示例中,如果 $x/@category
的值是 "children",則返回 <child>
元素,否則返回 <adult>
元素。
XQuery 比較
在 XQuery 中,可以使用通用比較(=
, !=
, <
, <=
, >
, >=
)和值比較(eq
, ne
, lt
, le
, gt
, ge
)。
XQuery 新增元素和屬性
XQuery 可以用於向結果中新增元素和屬性。
示例
<html>
<body>
<h1>書店</h1>
<ul>
{
for $x in doc("books.xml")/bookstore/book
order by $x/title
return <li class="{data($x/@category)}">{data($x/title)}</li>
}
</ul>
</body>
</html>
在上述示例中,根據書籍的類別向 HTML <li>
元素新增了一個類屬性。
XQuery 選擇和過濾
XML 示例文件
在瀏覽器中檢視 "books.xml" 檔案。
選擇和過濾元素
FLWOR 表示式
FLWOR(For, Let, Where, Order by, Return)表示式是一種結構化的查詢語言,用於對 XML 資料進行操作。
以下是一個 FLWOR 表示式的示例,透過選擇價格大於 30 的書籍,並按標題排序:
for $x in doc("books.xml")/bookstore/book
where $x/price>30
order by $x/title
return $x/title
在上述表示式中:
for
子句將每個書籍繫結到變數$x
。where
子句過濾出價格大於 30 的書籍。order by
子句按標題排序結果。return
子句指定返回書籍的標題。
for 子句
for
子句將一個變數繫結到由 in
表示式返回的每個專案。在同一個 FLWOR 表示式中可以有多個 for
子句。
示例:
for $x at $i in doc("books.xml")/bookstore/book/title
return <book>{$i}. {data($x)}</book>
在上述示例中,透過 at
關鍵字獲取迭代次數,並返回帶有索引的書籍標題。
let 子句
let
子句允許變數賦值,並且可以避免重複多次相同的表示式。let
子句不會導致迭代。
示例:
let $x := (1 to 5)
return <test>{$x}</test>
在上述示例中,let
子句建立變數 $x
,並將其賦值為 1 到 5 的序列。
where 子句
where
子句用於指定結果的一個或多個條件:
where $x/price>30 and $x/price<100
在上述示例中,where
子句篩選出價格在 30 到 100 之間的書籍。
order by 子句
order by
子句用於指定結果的排序順序:
order by $x/@category, $x/title
在上述示例中,order by
子句按照類別和標題對結果進行排序。
return 子句
return
子句指定要返回的內容:
return $x/title
在上述示例中,return
子句返回書籍的標題
XQuery函式
XQuery基於XPath表示式。XQuery 1.0和XPath 2.0共享相同的資料模型,並支援相同的函式和運算子。
XPath運算子
XPath函式
您還可以在XQuery中定義自己的函式
XQuery資料型別
XQuery共享與XML Schema 1.0(XSD)相同的資料型別。
-
XSD字串
-
XSD日期
-
XSD數值
-
XSD雜項
函式呼叫示例
函式呼叫可以出現在表示式可以出現的地方。請檢視下面的示例:
示例1:在元素中
<name>{`upper-case($booktitle)`}</name>
示例2:在路徑表示式的謂詞中
doc("books.xml")/bookstore/book[substring(title, 1, 5) = 'Harry']
示例3:在let子句中
let $name := (substring($booktitle, 1, 4))
XQuery使用者定義的函式
如果找不到您需要的XQuery函式,您可以編寫自己的函式。
使用者定義的函式可以在查詢中或在單獨的庫中定義。
語法
declare function prefix:function_name($parameter as datatype)
as returnDatatype
{
...function code here...
};
有關使用者定義函式的注意事項:
- 使用
declare function
關鍵字 - 函式的名稱必須有字首
- 引數的資料型別大多與XML Schema中定義的資料型別相同
- 函式的主體必須用大括號括起來
在查詢中宣告的使用者定義函式示例
declare function local:minPrice($p as xs:decimal?, $d as xs:decimal?)
as xs:decimal?
{
let $disc := ($p * $d) div 100
return ($p - $disc)
};
以下是如何呼叫上述函式的示例:
<minPrice>{`local:minPrice($book/price, $book/discount)`}</minPrice>
最後
為了方便其他裝置和平臺的小夥伴觀看往期文章:
微信公眾號搜尋:Let us Coding
,關注後即可獲取最新文章推送
看完如果覺得有幫助,歡迎點贊、收藏、關注