9.1 XPath语言简介

前一章在使用XSLT进行转换时需要使用XPath语言来定位和导航XML节点,因此介绍XSLT转换时已经大量使用了XPath语言,本章将更加系统地介绍XPath语言。

XPath使用路径表达式来选取XML 文档中的节点或者节点集。就笔者的眼光来看,XPath的路径表达式和我们的计算机中文件系统的路径表达式非常相似。

9.1.1 XPath节点

前面介绍XSLT时已经提到,XML文档中所有的内容都可称为节点。实际上,这是因为XPath将XML文档中的元素、属性和处理指令等内容都当成节点来对待。概括起来,XPath语言里的节点类别如表9.1所示。

表9.1 XPath支持的节点类型

alt

对于上面几种节点,读者很容易将属性节点和命名空间节点搞混淆,因为它们都是以属性形式存在的,例如如下XML文档片段:

alt

在上面的程序片段中,xmlns:crazyit="http://www.crazyit.org"并不是普通的属性节点,它是命名空间节点;而isbn="12345"才是普通的属性节点。


alt注意

对于XML元素里定义的属性,如果其属性名为xmlns:prefix,则该属性应该属于命名空间节点;如果其属性名是普通标识符,则该属性属于属性节点。


9.1.2 XPath基本概念

在学习XPath之前,先来了解一下XPath的基本概念。

基本值(或称原子值,Atomic value)

基本值专门用于表示简单的数据值,例如整数值、字符串等。我们可以把基本值当成没有父节点且没有子节点的节点。

项(Item)

项是XPath 2.0提出的一个术语,一个Item代表一个节点或基本值。

节点集和序列

在某些情况下,XPath表达式可以表示多个节点,多个节点组合在一起在XPath 1.0里称为节点集。XPath 2.0提出了一个序列(Sequence)的概念,XPath 2.0的序列既可以代表普通的Item,也可以代表节点集。也就是说,XPath 2.0将Item和节点集统一当成序列来处理。

对XPath 2.0而言,单个Item和只包含该Item的节点集是完全相同的。

9.1.3 节点关系

前面介绍XML文档时已经指出:XML文档是一份结构化文档,XML文档里各元素之间存在父子、兄弟等结构关系,这些关系对于XPath同样适用。下面就来简要介绍一下XPath所支持的4种节点关系。

父节点

在XPath里,每个元素和属性都有一个父节点,例如下例中的<book…/>元素是<name…/>、<author…/>和<price…/>元素的父元素。

alt

子节点

子节点和父节点是同一种关系的两个不同的观察方向,如果从父节点的角度来看,就是父节点包含零个、一个或多个子节点。

同样对于上面的示例XML文档,<name…/>、<author…/>和<price…/>元素都是<book…/>元素的子元素。

兄弟节点

如果一批节点拥有共同的父节点,那它们就属于兄弟节点。对于上面的示例XML文档而言,<name…/>、<author…/>和<price…/>元素互为兄弟节点。

祖先节点

祖先节点的概念比父节点的概念更大,它包括指定节点所有的外围节点,不仅包括指定节点的父节点,还包括父节点的父节点、父节点的父节点的父节点……对于如下XML文档片段:

alt

<name…/>元素的祖先节点包括<book…/>和<list…/>两个元素。

后代节点

后台节点的概念比子节点的概念更大,它包括指定节点所有的内部节点,不仅包括指定节点的所有子节点,还包括子节点的子节点、子节点的子节点的子节点……对于上面的XML文档片段,<list…/>元素的后代节点包括<book…/>、<name…/>、<author…/>和<price…/>这些所有位于该元素之内的元素。