XPath是在XML文档中查找信息的语言,可以在XML文档中对元素和属性进行遍历。XQuery和XPointer都是建立在XPath之上的。注意:只给出XPath,也可以返回该XPath下的所有节点的集合。
二、 XPath节点:共七种,XML文档被当作节点树对待,树根称为文档节点/根节点。
Harry Potter
J K. Rowling
2005
29.99
a) 元素:如
三、 XPath节点关系:
a) Parent:父节点;
五、 项目:即基本值或节点。
六、 XPath语法:每个XPath表达式由若干个step组成,除了最后一个step每个都会返回一个set节点,而最后一个step可以返回number、boolean、字符串或node集合。
a) 选取节点:
i. nodename:选取当前节点的所有子节点,如bookstore,选取bookstore元素的所有子节点。
ii. /:从根节点开始选取。
1. 如/bookstore,选取bookstore作为根元素。
iii. //:从匹配选择的当前节点选择文档中的节点,不考虑其位置。
1. 如//book,表示选取所有的book子元素,不考虑其在文档中的位置。
iv. .:选取当前节点,相当于self::。
v. ..:选取当前结点的父节点,相当于parent::。
vi. @:选取属性。如//@lang,表示选取所有lang属性。
b) 谓词(Predicates):嵌在方括号中,用于查找某个特定的/包含某个特定值得节点。
i. /bookstore/book[1]:选取bookstore子元素中的第一个book元素;
d) 选取多条路径:|
i. //book/title | //book/price:选出所有book元素的title和price?选取 book 元素的所有 title 和 price 元素?
七、 XPath轴(Axes):用于定义相对于当前节点的节点集。位置路径可以是绝对的(以/开始)也可以是相对的(以元素/节点开始),每个/分隔一个step。
a) Step:语法——axisName::nodeTest[predicate]绝对路径:
Everyday Italian
Giada De Laurentiis
2005
30.00
Harry Potter
J K. Rowling
2005
29.99
XQuery Kick Start
James McGovern
Per Bothner
Kurt Cagle
James Linn
Vaidyanathan Nagarajan
2003
49.99
Learning XML
Erik T. Ray
2003
39.95
doc("books.xml")/bookstore/book[price>35]/count(author)
for $x in doc("books.xml")/bookstore/book
return if ($x/@category="CHILDREN")
then {data($x/title)}
else {data($x/title)}
查询结果如下:
Everyday Italian
Harry Potter
Learning XML
XQuery Kick Start
b) 比较操作:
i. 通用比较:=, !=, <, <=, >, >=。
{
for $x in doc("books.xml")/bookstore/book
order by $x/title
return - {data($x/title)}. Category: {data($x/@category)}
}
- Everyday Italian. Category: COOKING
- Harry Potter. Category: CHILDREN
- Learning XML. Category: WEB
- XQuery Kick Start. Category: WEB
ii. 添加属性:使用class添加属性
{
for $x in doc("books.xml")/bookstore/book
order by $x/title
return - {data($x/title)}
}
查询结果:
- Everyday Italian
- Harry Potter
- Learning XML
- XQuery Kick Start
for $x in doc("books.xml")/bookstore/book
where $x/price>35
return $x/count(author)
i. 加标签:
xquery version "1.0";
{
for $x in doc("books.xml")/bookstore/book
where $x/price>35
return - {$x/count(author)}
}
查询结果:
- 5
- 1
{
for $x in doc("books.xml")/bookstore/book/title
order by $x
return - {data($x)}
}
- Everyday Italian
- Harry Potter
- Learning XML
- XQuery Kick Start
for $x at $i in doc("books.xml")/bookstore/book/title
return {$i}. {data($x)}
查询结果:变量i记录了循环的次数
1. Everyday Italian
2. Harry Potter
3. XQuery Kick Start
4. Learning XML
for $x in (10,20), $y in (100,200)
return x={$x} and y={$y}
查询结果:
x=10 and y=100
x=10 and y=200
x=20 and y=100
x=20 and y=200
for $x1 in doc("books.xml")/bookstore
return for $x2 in $x1/book
return $x2/price
for $x2 in (for $x1 in doc("books.xml")/bookstore
return $x1/book)
return $x2/price
查询结果:
30.00
29.99
49.99
39.95
let $x :=doc("books.xml")/bookstore/book/title
return {data($x)}
查询结果:
Everyday ItalianHarry
PotterXQuery
Kick
StartLearning XML
v. where语句:用于过滤绑定的结果,后面常跟条件表达式。
for $x in doc("books.xml")/bookstore/book
where $x/price>30 and $x/price<100
return $x
查询结果:
XQuery Kick Start
James McGovern
Per Bothner
Kurt Cagle
James Linn
Vaidyanathan Nagarajan
2003
49.99
Learning XML
Erik T. Ray
2003
39.95
for $x in doc("books.xml")/bookstore/book
where $x/price>30 and $x/price<100
order by $x/price descending
return $x
declare function local:minPrice(
$price as xs:decimal)
as xs:decimal
{
let $disc :=($price) div 100
return ($price - $disc)
};
for $x in doc("books.xml")/bookstore/book
return {local:minPrice($x/price)}
29.7
29.6901
49.4901
39.5505
目标html为:
Book List
Book List
2005
Giada De Laurentiis
30.00
2005
J K. Rowling
29.99
2003
James McGovern
Per Bothner
Kurt Cagle
James Linn
Vaidyanathan Nagarajan
49.99
2003
Erik T. Ray
39.95
Book List
Book List
{
for $x in doc("books.xml")/bookstore/book
return
{$x/year}
{$x/author}
{$x/price}
}
目标XML文档:
转换XQuery文档:
xquery version "1.0";
{
for $div in doc("company.xml")/company/div
return for $dept in $div/dept
return for $emp in $dept/emp
return
{data($emp/@name)}
{data($div/@no)}
{data($dept/@no)}
}
(:
{
for $emp in doc("company.xml")//emp
return
{data($emp/@name)}
{data($emp /../../@no)}
{data($emp /../@no)}
}
:)