XQuery 相对于 XML 的关系,等同于 SQL 相对于数据库表的关系。
XQuery 被设计用来查询 XML 数据 - 不仅仅限于 XML 文件,还包括任何可以 XML 形态呈现的数据,包括数据库。
XQuery 是用来从 XML 文档查找和提取元素及属性的语言。
这是一个 XQuery 解决实际问题的例子:
“从存储在名为 cd_catalog.xml 的 XML 文档中的 CD 集那里选取所有价格低于 10 美元的 CD 记录。”
XQuery 可用于:
- 提取信息以便在网络服务中使用
- 生成摘要报告
- 把 XML 数据转换为 XHTML
- 为获得相关信息而搜索网络文档
现有一个xml文件 books.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<bookstore>
<book category="COOKING">
<title lang="en">Everyday Italian</title>
<author>Giada De Laurentiis</author>
<year>2005</year>
<price>30.00</price>
</book>
<book category="CHILDREN">
<title lang="en">Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
<book category="WEB">
<title lang="en">XQuery Kick Start</title>
<author>James McGovern</author>
<author>Per Bothner</author>
<author>Kurt Cagle</author>
<author>James Linn</author>
<author>Vaidyanathan Nagarajan</author>
<year>2003</year>
<price>49.99</price>
</book>
<book category="WEB">
<title lang="en">Learning XML</title>
<author>Erik T. Ray</author>
<year>2003</year>
<price>39.95</price>
</book>
</bookstore>
打开xml文件
doc("books.xml")
选取元素
使用路径表达式选取
doc("books.xml")/bookstore/book/title
/bookstore 选取 bookstore 元素,/book 选取 bookstore 元素下的所有 book 元素,而 /title 选取每个 book 元素下的所有 title 元素
选取结果
<title lang="en">Everyday Italian</title>
<title lang="en">Harry Potter</title>
<title lang="en">XQuery Kick Start</title>
<title lang="en">Learning XML</title>
有条件的选取
选取 bookstore 元素下的所有 book 元素,并且所选取的 book 元素下的 price 元素的值必须小于 30
doc("books.xml")/bookstore/book[price<30]
选取结果
<book category="CHILDREN">
<title lang="en">Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
使用 FLWOR 从 "books.xml" 选取节点
FLWOR 是 "For, Let, Where, Order by, Return" 的只取首字母缩写。
-
for语句把 bookstore 元素下的所有 book 元素提取到名为 $x 的变量中。
-
where 语句选取了 price 元素值大于 30 的 book 元素。
-
order by 语句定义了排序次序。将根据 title 元素进行排序。
-
return 语句规定返回什么内容。在此返回的是 title 元素。
选取 bookstore 元素下的 book 元素下所有的 title 元素,并且其中的 price 元素的值必须大于 30
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>
使用order进行排序
for $x in doc("books.xml")/bookstore/book
where $x/price>30
order by $x/title
return $x/title
结果
<title lang="en">Learning XML</title>
<title lang="en">XQuery Kick Start</title>
结果中加入标签
则需要将查询结果用大括号括起来
for $x in doc("book.xml")/bookstore/book
where $x/year = 2003 and $x/price > 40
return
<result>
{$x}
</result>
结果
<result><book category="WEB">
<title lang="en">XQuery Kick Start</title>
<author>James McGovern</author>
<author>Per Bothner</author>
<author>Kurt Cagle</author>
<author>James Linn</author>
<author>Vaidyanathan Nagarajan</author>
<year>2003</year>
<price>49.99</price>
</book></result>
对实体属性的值进行限制
$实体[属性条件]
for $x in doc("book.xml")/bookstore/book
where $x[price="39.95"]
return
<test>{$x/author}</test>
<bib>
<vendor id="idl_2">
<name>china-pub</name>
<book>
<title>JAVA编程思想</title>
<publisher>机械工业出版社</publisher>
<year>2002</year>
<author>
<firstname>Bruce</firstname>
<lastname>Eckel</lastname>
</author>
<price>99</price>
</book>
<book>
<title>XML手册</title>
<publisher>电子工业出版社</publisher>
<year>2003</year>
<author>
<firstname>CharlesF.</firstname>
<lastname>Goldfarb</lastname>
</author>
<price>69</price>
</book>
</vendor>
</bib>
返回书籍的最高价格
let $maxPrice := max(
for $book in doc("book.xml")/bookstore/book
return $book/price
)
return $maxPrice
结果
49.99
返回最低价格
let $minPrice := min(
for $book in doc("book.xml")/bookstore/book
return $book/price
)
return $minPrice
结果
29.99
平均值
let $minPrice := avg(
for $book in doc("book.xml")/bookstore/book
return $book/price
)
return $minPrice
结果
37.4825
22年试卷
查找该xml文档中价格最高的书,输出其title和price信息
let $maxPrice := max(
for $book in doc("book.xml")/bookstore/book
return xs:float($book/price)
)
for $book in doc("book.xml")/bookstore/book
where xs:float($book/price) = $maxPrice
return <result>
<title>{ $book/title }</title>
<price>{ $book/price }</price>
</result>
结果
<result><title><title lang="en">XQuery Kick Start</title></title><price><price>49.99</price></price></result>
输出该文档第1本书和第2本书的价钱之差
let $firstBookPrice := doc("book.xml")/bookstore/book[1]/price
let $secondBookPrice := doc("book.xml")/bookstore/book[2]/price
return $firstBookPrice - $secondBookPrice
结果
0.01
查找该文档中价格高于70的书,输出其title和price信息
for $x in doc("book.xml")/bookstore/book
where $x/price > 70
return
<result>
<title>{$x/title}</title>
<price>{$x/price}</price>
</result>
结果
<result><title><title lang="en">Learning XML</title></title><price><price>71</price></price></result>
标签:语句,xml,return,--,doc,price,XQuery,book,bookstore
From: https://www.cnblogs.com/lmc7/p/17931659.html