<name> {$p/text()} </name>
{for $b in document("bib.xml")//book[publisher = $p]
return
<book>
{$b/title}
{$b/price}
</book>
sortby(price descending)
}
</publisher>
sortby(name)
}
</publisher_list>
需要注意的是:sortby如果在路径表达式中使用sortby将会造成不可预期的结果。
下面我们再来分析下面的例子:
(employees sortby (salary))/name
你可能会觉得返回的查询结果一定是按照雇员的收入排列的雇员的名字。但是,路径表达式总是返回按照文档顺序的结点序列。因此,这个查询的结果是按照文档序列排列的雇员名列表。如果希望得到的名字序列是按照工资顺序输出的,查询的方法就应当如下所示:
for $e in (employees sortby (salary)) return $e/name
过滤
函数filter($doc//(a | b))返回一个森林。
? 从$doc中过滤掉不是a和b类的结点。
? 保护a类结点和b类结点的关系。
执行过滤前的:$doc 执行过滤后的:filter($doc//(a | b))
下面的例子就用了过滤来返回cookbook.xml文件的目录。
<toc>
{
filter(document("cookbook.xml") //
(section | section/title | section/title/text()))
}
</toc>
在序列中的查询
xquery使用precedes,follows,<< 和 >>操作符来表示序列关系。下面的这部分查询包含了一个外科手术报告,包含了流程(procedure),开刀(incision),以及麻醉元素(anesthesia)。
下面的查询返回在第一个流程的第一个手术和第二个手术的元素和结点序列。
<critical-sequence>
{
let $proc := //procedure[1]
for $n in $proc//node()
where $n follows ($proc//incision)[1]
and $n precedes ($proc//incision)[2]
return $n
}
</critical-sequence>
spj查询: 雇员与管理人员的名字
这里有一个例子:
<empandmanagers>
for $e in document ("emp.xml")//entry
for $m in document("dept.xml")//entry
where $e/dname = $m/dname
return
<empmanager>
$e/name,
$m/mname
</empmanager>
sortby(name descending)
</empandmanagers>
查询将会返回下面的xml文档 document。
<empandmanagers>
<empmanager>
<name> mary </name>
<mname> mary </mname>
</empmanager>
<empmanager>
<name> leu </name>
<mname> leu </mname>
</empmanager>
<empmanager>
<name> john </name>
<mname> mary </mname>
</empmanager>
</empandmanagers>
下面是进行查询的另外一种书写方法。
<empandmanagers>
for $e in document ("emp.xml")//entry
for $m in document("dept.xml")//entry[dname = $e/dname]/mname
return
<empmanager>
$e/name,
$m
</empmanager>
sortby(name descending)
</empandmanagers>
如果我们考虑用let语句来代替第二个for语句应当如何做呢?我们来看下面的查询。
<empandmanagers>
for $e in document ("emp.xml")//entry
let $m := document("dept.xml")//entry[dname = $e/dname]/mname
return
<empmanager>
$e/name,