XPath 简介
XPath 是一种在XML 文档中查找信息的语言。XPath 用于在XML 文档中通过元素和属性进行导航。
XPath 标准函数
XPath 含有超过100 个内建的函数。这些函数用于字符串值、数值、日期和时间表、节点和QName 处
理、序列处理、逻辑值等等。
XPath 在XSLT 中使用
XPath 是XSLT 标准中的主要元素。
XPath 节点
在XPath 中,有七种类型的节点:元素、属性、文本、命名空间、处理指令、注释以及文档节点(或成
为根节点)。
节点(Node)
XML 文档是被作为节点树来对待的。树的根被称为文档节点或者根节点。
基本值(或称原子值,Atomic value)
基本值是无父或无子的节点。如元素节点的值或属性的值。
项目(Item)
项目是基本值或者节点。
节点关系
父(Parent)
每个元素以及属性都有一个父
子(Children)
节点元素可有零个、一个或多个子。
同胞(Sibling)
拥有相同的父的节点
先辈(Ancestor)
某节点的父、父的父,等等。
后代(Descendant)
某个节点的子,子的子,等等。
XPath 语法
XPath 使用路径表达式来选取XML 文档中的节点或节点集。节点是通过沿着某个路径(path)或者步
(step)来选取的。
在下面的例子中使用这个XML 文档。
<?xml version="1.0" encoding="ISO-8859-1"?>
<bookstore>
<book>
<title lang="eng">Harry Potter</title>
<price>29.99</price>
</book>
<book>
<title lang="eng">Learning XML</title>
<price>39.95</price>
</book>
</bookstore>
下面列出了最有用的路径表达式:
表达式 描述
nodename 选取此节点的所有子节点
/ 从根节点选取
// 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置
. 选取当前节点
.. 选取当前节点的父节点
@ 选取属性
举例:
路径表达式 结果
bookstore 选取bookstore 元素的所有子节点
/bookstore 选取bookstore 根元素
注释:假如路径起始于正斜杠( / ),则此路径为到某元素的绝对路径!
bookstore/book 选取所有属于bookstore 的子元素的book 元素。
//book 选取所有book 子元素,而不管它们在文档中的位置。
bookstore//book 选择所有属于bookstore 元素的后代的book元素,而不管它们位于bookstore
之下的什么位置。
//@lang 选取所有名为lang 的属性。
谓语(Predicates)
谓语用来查找某个特定的节点或者包含某个指定的值的节点。
谓语被嵌在方括号中。
举例:
路径表达式 结果
/bookstore/book[1] 选取属于bookstore 子元素的第一个book 元素。
/bookstore/book[last()] 选取属于bookstore 子元素的最后一个book 元素。
/bookstore/book[last()-1] 选取属于bookstore 子元素的倒数第二个book 元素。
/bookstore/book[position()<3] 选取最前面的两个属于bookstore 元素的子元素的
book 元素。
//title[@lang] 选取所有拥有名为lang 的属性的title 元素。
//title[@lang='eng'] 选取所有title 元素,且这些元素拥有值为eng 的
lang 属性。
/bookstore/book[price>35.00] 选取所有bookstore 元素的book 元素,且其中的
price 元素的值须大于35.00。
/bookstore/book[price>35.00]/title 选取所有bookstore 元素中的book 元素的title 元
素,且其中的price 元素的值须大于35.00。
选取未知节点
XPath 通配符可用来选取未知的XML 元素
通配符 描述
* 匹配任何元素节点
@* 匹配任何属性节点
node() 匹配任何类型的节点
举例:
路径表达式 结果
/bookstore/* 选取bookstore 元素的所有子节点
//* 选取文档中的所有元素
//title[@*] 选取所有带有属性的title 元素。
选取若干路径
通过在路径表达式中使用“|”运算符,您可以使用选取若干个路径。
XPath Axes(坐标轴)
XML 实例文档
<?xml version="1.0" encoding="ISO-8859-1"?>
<bookstore>
<book>
<title lang="eng">Harry Potter</title>
<price>29.99</price>
</book>
<book>
<title lang="eng">Learning XML</title>
<price>39.95</price>
</book>
</bookstore>
XPath 轴
轴可定义某个相对于当前节点的节点集。
轴名称 结果
ancestor 选取当前节点的所有先辈(父、祖父等)
ancestor-or-self 选取当前节点的所有先辈(父、祖父等)以及当前节点本身
attribute 选取当前节点的所有属性
child 选取当前节点的所有子元素。
descendant 选取当前节点的所有后代元素(子、孙等)。
descendant-or-self 选取当前节点的所有后代元素(子、孙等)以及当前节点本身。
following 选取文档中当前节点的结束标签之后的所有节点。
namespace 选取当前节点的所有命名空间节点
parent 选取当前节点的父节点。
preceding 选取文档中当前节点的开始标签之前的所有节点。
preceding-sibling 选取当前节点之前的所有同胞。
self 选取当前节点。
位置路径表达式
位置路径可以是绝对的,也可以是相对的。
绝对路径起始于正斜杠( / ),而相对路径不会这样。在两种情况中,位置路径均包括一个或多个步,每个
步均被斜杠分割:
绝对位置路径:
/step/step/...
相对位置路径:
step/step/...
每个步均根据当前节点集之中的节点来进行计算。
步(step)包括:
轴(axis)
定义所选节点与当前节点之间的树关系
节点测试(node-test)
识别某个轴内部的节点
零个或者更多谓语(predicate)
更深入地提炼所选的节点集
步的语法:
轴名称::节点测试[谓语]
举例:
例子 结果
child::book 选取所有属于当前节点的子元素的book 节点
attribute::lang 选取当前节点的lang 属性
child::* 选取当前节点的所有子元素
attribute::* 选取当前节点的所有属性
child::text() 选取当前节点的所有文本子节点
child::node() 选取当前节点的所有子节点
descendant::book 选取当前节点的所有book 后代
ancestor::book 选择当前节点的所有book 先辈
ancestor-or-self::book 选取当前节点的所有book 先辈以及当前节点(假如此节点是book 节
点的话)
child::*/child::price 选取当前节点的所有price 孙。
XPath 运算符
XPath 表达式可返回节点集、字符串、逻辑值以及数字。
算符 描述 实例 返回值
| 计算两个
节点集
//book | //cd 返回所有带有book 和ck 元素的节点集
+ 加法 6 + 4 10
- 减法 6 - 4 2
* 乘法 6 * 4 24
div 除法 8 div 4 2
= 等于 price=9.80 如果price 是9.80,返回值为true 如果price
是9.90,返回值为fasle
!= 不等于 price!=9.80 如果price 是9.90,返回值为true 如果price
是9.98,返回值为fasle
< 小于 price<9.80 如果price 是9.00,返回值为true 如果price
是9.98,返回值为fasle
<= 小于或等于 price<=9.80 如果price 是9.00,返回值为true 如果price
是9.90,返回值为fasle
> 大于 price>9.80 true if price is 9.90 false if price is9.80
>= 大于或等于 price>=9.80 true if price is 9.90 false if price is9.70
or 或 price=9.80 or price=9.70 true if price is 9.80 false if price is 9.50
and 与 price>9.00 and price<9.90 true if price is 9.80 false if price is 8.50
mod 计算除法 的余数 5 mod 2 1
XPath 函数
节点集函数
节点集函数接受 node-set 参数。这些函数返回节点集或与节点集内的特定节点有关的信息。
节点集函数
count 返回 node-set 参数中的节点数。
id 按照唯一 ID 选择元素。
last 返回的数字等于表达式计算上下文的上下文大小。
local-name 返回 node-set 参数中按文档顺序处于第一位的节点的扩展名称本地部分。
name 返回的字符串包含一个 QName,该 QName 表示 node-set 参数中按文档顺序处于第一位
的节点的扩展名称。
namespace-uri 返回 node-set 参数中按文档顺序处于第一位的节点的扩展名称的命名空间统一资源标
识符 (URI)。
position 返回节点在父级中的索引号。
字符串函数
字符串函数用于计算、格式化和处理字符串参数,或将对象转换为字符串。
字符串函数
concat 返回参数的串联。
contains 如果第一个参数字符串包含第二个参数字符串,则返回 true;否则,返回 false。
normalize-space 返回去除了空白的参数字符串。
starts-with 如果第一个参数字符串以第二个参数字符串开头,则返回 true;否则,返回 false。
string 将对象转换为字符串。
string-length 返回字符串中的字符数。
substring 返回第一个参数中从第二个参数指定的位置开始、第三个参数指定的长度的子字符串。
substring-after 返回第一个参数字符串中第一次出现第二个参数字符串之后的子字符串。
substring-before 返回第一个参数字符串中第一次出现第二个参数字符串之前的子字符串。
translate 返回第一个参数字符串,出现第二个参数字符串中的字符的位置替换为第三个参数字
符串中对应位置的字符。
布尔函数
XML 路径语言 (XPath) 语法支持布尔函数,这些函数返回字符串或数字,可以与筛选模式中的比较运算符
一起使用。
布尔函数
boolean 将参数转换为布尔值。
false 返回 false。
lang 如果上下文节点的 xml:lang 属性与参数字符串相同,则返回 true。
not 如果参数为 false,则返回 true,否则,返回 false。
true 返回 true。
数值函数
XML 路径语言 (XPath) 语法支持数值函数,这些函数返回字符串或数字,可以与筛选模式中的比较运算符
一起使用。
数值函数
ceiling 返回不小于参数的最小整数。
floor 返回不大于参数的最大整数。
number 将参数转换为数字。
round 返回与参数最接近的整数值。
sum 返回节点集中所有节点的总和。每个节点在求和之前先转换为数值。