XQuery 也被称为 XML Query,被设计用来查询 XML 数据。

学习这个 需要知道

  • HTML / XHTML
  • XML / XML 命名空间
  • XPath

XML 实例文档

我们将在下面的例子中使用这个 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>

 

如何从 "books.xml" 选取节点?

函数

XQuery 使用函数来提取 XML 文档中的数据。

doc() 用于打开 "books.xml" 文件:

doc("books.xml")

路径表达式

XQuery 使用路径表达式在 XML 文档中通过元素进行导航。

下面的路径表达式用于在 "books.xml" 文件中选取所有的 title 元素:

doc("books.xml")/bookstore/book/title

(/bookstore 选取 bookstore 元素,/book 选取 bookstore 元素下的所有 book 元素,而 /title 选取每个 book 元素下的所有 title 元素)

上面的 XQuery 可提取以下数据:

<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>

谓语

XQuery 使用谓语来限定从 XML 文档所提取的数据。

下面的谓语用于选取 bookstore 元素下的所有 book 元素,并且所选取的 book 元素下的 price 元素的值必须小于 30:

doc("books.xml")/bookstore/book[price<30]

上面的 XQuery 可提取到下面的数据:

<book category="CHILDREN">
  <title lang="en">Harry Potter</title>
  <author>J K. Rowling</author>
  <year>2005</year>
  <price>29.99</price>
</book>

问题:选取 bookstore 元素下的 book 元素下所有的 title 元素,并且其中的 price 元素的值必须大于 30。
方法一:doc("books.xml")/bookstore/book[price>30]/title
方法一:

for $x in doc("books.xml")/bookstore/book
where $x/price>30
return $x/title

两种方式选取节点:1.通过XPath,2.flwor(for let where orderby return)html到XQuery之间需要用{}连接,XQuery到HTML直接连接

for 语句把 bookstore 元素下的所有 book 元素提取到名为 $x 的变量中。

where 语句选取了 price 元素值大于 30 的 book 元素。

order by 语句定义了排序次序。将根据 title 元素进行排序。

return 语句规定返回什么内容。在此返回的是 title 元素。

 

例如:

<ul>
{
for $x in doc("books.xml")/bookstore/book/title
order by $x
return <li>{$x}</li>
}
</ul>

以上代码的结果:

<ul>
<li><title lang="en">Everyday Italian</title></li>
<li><title lang="en">Harry Potter</title></li>
<li><title lang="en">Learning XML</title></li>
<li><title lang="en">XQuery Kick Start</title></li>
</ul>

现在我们希望去除 title 元素,而仅仅显示 title 元素内的数据。

<ul>
{
for $x in doc("books.xml")/bookstore/book/title
order by $x
return <li>{data($x)}</li>
}
</ul>

结果将是一个 HTML 列表:

<ul>
<li>Everyday Italian</li>
<li>Harry Potter</li>
<li>Learning XML</li>
<li>XQuery Kick Start</li>
</ul>

XQuery 的基础语法规则:

一些基本的语法规则:

  • XQuery 对大小写敏感
  • XQuery 的元素、属性以及变量必须是合法的 XML 名称。
  • XQuery 字符串值可使用单引号或双引号。
  • XQuery 变量由 “$” 并跟随一个名称来进行定义,举例,$bookstore
  • XQuery 注释被 (: 和 :) 分割,例如,(: XQuery 注释 :)

XQuery 条件表达式

"If-Then-Else" 可以在 XQuery 中使用。

请看下面的例子:

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>

请注意 "If-Then-Else" 的语法:if 表达式后的圆括号是必需的。else 也是必需的,不过只写 “else ()” 也可以。

上面的例子的结果:

<adult>Everyday Italian</adult>
<child>Harry Potter</child>
<adult>Learning XML</adult>
<adult>XQuery Kick Start</adult>


XQuery 比较

在 XQuery 中,有两种方法来比较值。

  1. 通用比较:=, !=, <, <=, >, >=
  2. 值的比较:eq、ne、lt、le、gt、ge