XML 路径语言(XPath) 版本 1.0

XML 路径语言(XPath) 版本 1.0

万维网协会 (W3C) 建议 1999November16

本版本:
http://www.w3.org/TR/1999/REC-xpath-19991116 (其它文件格式: XML [英文] HTML [英文] )
最新版本:
http://www.w3.org/TR/xpath 中文翻译 [简体中文]
以前版本:
http://www.w3.org/TR/1999/PR-xpath-19991008
http://www.w3.org/1999/08/WD-xpath-19990813
http://www.w3.org/1999/07/WD-xpath-19990709
http://www.w3.org/TR/1999/WD-xslt-19990421
编者:
James Clark <jjc@jclark.com>
Steve DeRose, Inso Corp. and Brown University <Steven_DeRose@Brown.edu>

摘要

XPath 是一种用于对 XML 文档的元件寻址的一语言,设计为 XSLT 和 XPointer 使用。

本文档的地位

本文档已由万维网协会 (W3C) 组织成员和其他感兴趣的各方审阅,并已被组织理事批准为万维网协会 (W3C) 建议。这是一个稳定的文档,可以用作参考材料,也可以作为其他文档的标准参考文献。W3C 在建议制定过程中的作用是吸引对本规范的注意并促进它的广泛使用。这能增强 Web 的功能和互操作性。

本规格说明已知的错误列表在 http://www.w3.org/1999/11/REC-xpath-19991116-errata

对本说明的建议可电邮到 www-xpath-comments@w3.org存档的建议可供备查。

英文版是唯一的正式版,本文档的翻译请参见 http://www.w3.org/Style/XSL/translations.html

现有 W3C 建议和其他技术文档的列表在 http://www.w3.org/TR

本规格是 XSL 工作组及 XML 链接工作组联合的工作成果,因此也是 XML 式样制定工作(W3C Style activity)W3C XML 制定工作(W3C XML Activity)的一部分。

目录

1 绪论
2 地址路径
    2.1 地点步进
    2.2
    2.3 节点测试
    2.4 判定词
    2.5 缩简句法
3 表达式
    3.1 基础
    3.2 函数调用
    3.3 节点集合
    3.4 布尔
    3.5 数字
    3.6 字符串
    3.7 词法结构
4 核心函数库
    4.1 节点集合函数
    4.2 字符串函数
    4.3 布尔函数
    4.4 数字函数
5 数据模型
    5.1 根节点
    5.2 元素节点
        5.2.1 唯一 ID
    5.3 属性节点
    5.4 命名空间节点
    5.5 处理指令节点
    5.6 注释节点
    5.7 正文节点
6 一致性

附录

A 参考书目
    A.1 标准规范参考书目
    A.2 其他参考书目
B XML 信息集映射(非标准)


1 绪论

XPath 是努力给 XSL 转换[XSLT]和 XPointer [XPointer]的共享功能提供一个共用的句法及语义的结果。XPath的主要的目是用于对 XML [XML]文档元件寻址。在支持这个主要目的的同时,它也为字符串,数字和布尔的操作提供了基本手段。XPath 使用简明的、非 XML 句法以便於在 URIs 和 XML 属性值以内使用 XPath,XPath 对 XML 文档的抽象的、逻辑的结构而非它的表面句法进行操作,XPath 的名字源于它在 URL 中用作对 XML 文档的层次的结构进行导航一个路径标志。

除了用做寻址外,XPath 也被设计成以便它有能被用于匹配的一个自然的子集(测试一个节点是否匹配一个模式);XSLT中描述了 XPath 在这方面的使用。

XPath 将一个 XML 文档建模成为一棵节点树,有不同类型的节点,包括元素节点,属性节点和正文节点。XPath 定义了一种方法来计算每类的节点的字串值。一些节点的类型也有名字。XPath 充分支持 XML 命名空间[XML Names]。这样,节点的名字被建模成由一个局城部分和可能为空的命名空间 URI 组成的对;这被称为扩展名5 数据模型描述了数据模型详细细节。

XPath的主要语法构件是表达式,一个表达式匹配产生式 Expr,一个表达式被求值评估产出一个对象,该对象有下列 4 种基本的类型之一:

节点集合(无序的、无重复的节点集合)
布尔(真或假)
数字(一个浮点数字)
字符串(UCS 字符的顺序)

表达式求值发生与上下文有关。XSLT 和 XPointer 分别地指定了上下文怎样在 XSLT 和 XPointer 使用 XPath 表达式。上下文组成包括:

一个节点([定义上下文节点])
一对非零正整数([定义上下文位置]和[定义上下文大小])
一个变量绑定的集合
一个函数库
表达式范围内的命名空间声明的集合

上下文位置总是小於或等於上下文的大小。

绑定由从变量名到变量值映射组成,一个变量的值是一个对象,它的类型可以是任何表达式的值可能的类型,并且也可以有这里没指定的另外的类型。

函数库由从函数名到函数的映射组成,每个函数可接受零个或零个以上的参数并且返回单个的结果。本文档定义了所有的 XPath 实现必须支持的一个核心函数库(参看4 核心函数库)。对於核心函数库中的每一个函数,参数和结果有4种基本的类型。XSLT 和 XPointer 通过定义另外的函数来扩展 XPath 的函数;这些函数有些对 4 种基本的类型操作,其它的则对 XSLT 和 XPointer 定义的另外的数据类型操作。

命名空间声明由从前缀到命名空间 URI 的映射组成。

变量绑定、函数库及命名空间声明对於求表达式或其子表达式的值总是一样的;上下文节点、上下文位置及大小对於求表达式或其子表达式的值则是不同的。有多种表达式可改变上下文节点,而只有判定词能改变上下文位置和上下文大小(参看2.4 判定词)。在描述一种表达式的求值时,必须总是明确地说明是上下文节点、上下文位置、还是上下文的大小对子表达式的求值产生变化,如果没有关于上下文节点、上下文位置、上下文的大小的说明,那么对那种表达式的子表达式的求值就保持不变。

XPath 表达式经常出现在 XML 属性里,在本节中说明的语法适用于在 XML 1.0 规范化以后的属性值。因此,如果语法要使用字符 <,而该字符却绝对不能以 < 出现在任何的 XML 资料中,这样必须遵循 XML 1.0 的规则,也就是应键入成 &lt;。在表达式以内,文字的字符串由单引号或双引号来界定,它也用于界定 XML 属性。为了避免 XML 处理器将表达式中的引号解释成属性界定符,引号可以键入成字符参考( &quot;&apos; )。做为选择,如果 XML 属性使用双引号,表达式则可以使用单引号,反之亦然。

一种重要的表达式类型是地点路径,地址路径选择与上下文节点相关的节点集合。对是地址路径的表达式求值的结果是节点集合,该节点集合包含地点路径选择的节点。地址路径能递归地包含表达式,这些表达式用来过滤节点集合。地址路径与此同时LocationPath 相匹配。

在下列语法里,非终结的 QNameNCName 定义在[XML Names]中,而S定义在[XML]中。语法与[XML]一样使用 EBNF 符号表示法(除了总是以大写字母起头的语法符号)。

分析表达式时,首先将字符字符串分解成分割段(token),然后再分析所得分割段结果的序列。空白符能自由地在分割段之间被使用。分段化(tokenization)过程在3.7 词法结构中描述。

2 地址路径

尽管地址路径不是本语言中最完整的语法的构件(地址路径 LocationPathExpr 的一个特殊的例子),他们却是最重要的构件,因此,将首先进行描述。

每一条地址路径都能使用直观但是相当冗长的句法表示,同时也有很多缩简句法可用以简明地表示常见路径。这节将解释使用未经缩写的句法的地址路径的语义。然后将通过显示缩简的句法怎扩展成未经缩写的句法来解释缩简句法(看2.5 缩简句法)。

这是使用未经缩写的句法的地址路径的一些例子:

  • child::para 选择上下文节点的 para 元素孩子

  • child::* 选择上下文节点的所有元素孩子

  • child::text() 选择上下文节点的所有的正文节点

  • child::node() 选择上下文节点的所有的孩子,而不论它们是什么节点类型

  • attribute::name 选择上下文节点的 name 属性

  • attribute::* 选择上下文节点的所有的属性

  • descendant::para 选择上下文节点的 para 元素子孙

  • ancestor::div 选择上下文节点的 div 祖先

  • ancestor-or-self::div 选择上下文节点的 div 祖先,并且,如果上下文节点为 div 元素,则该上下文节点也被选择

  • descendant-or-self::para 选择上下文节点中所有的 div 元素子孙,而且,如果上下文节点是一个 div 元素,则该上下文节点也被选择

  • self::para 如果上下文节点是一个 para 元素,选择该上下文节点,否则不选择任何东西

  • child::chapter/descendant::para 选择上下文节点的 chapter 元素孩子的所有的 para 元素子孙

  • child::*/child::para 选择上下文节点的所有的 para 孙子

  • / 选择文档根(它总是是文档元素的父)

  • /descendant::para 选择在同一文档中所有的 para 元素作为上下文节点

  • /descendant::olist/child::item 选择在同一文档中所有的以 olist 为父的 item 元素作为上下文节点

  • child::para[position()=1] 选择上下文节点的第一个 para 孩子

  • child::para[position()=last()] 选择上下文节点的最后一个 para 孩子

  • child::para[position()=last()-1] 选择上下文节点的倒数第二个 para 孩子

  • child::para[position()>1] 选择上下文节点中除第一个以外所有的 para 孩子

  • following-sibling::chapter[position()=1] 选择上下文节点的下一个 chapter 兄弟

  • preceding-sibling::chapter[position()=1] 选择上下文节点的前一个 chapter 兄弟

  • /descendant::figure[position()=42] 选择文档中第四十二个 figure 元素

  • /child::doc/child::chapter[position()=5]/child::section[position()=2] 选择文档元素 doc 的第五个 chapter 的第二个 section

  • child::para[attribute::type='warning"] 选择的上下文节点中有属性 type 且值为 warningpara 孩子

  • child::para[attribute::type='warning'][position()=5] 选择的上下文节点中所有的有属性 type 且值为 warningpara 孩子中第五个孩子

  • child::para[position()=5][attribute::type="warning"] 选择的上下文节点中第五个 para 孩子,如果该孩子有 type 属性且值为 warning 的话

  • child::chapter[child::title='Introduction'] 选择的上下文节点的 chapter 孩子,这些孩子有一个或一个以上字串值等於 Introductiontitle 孩子

  • child::chapter[child::title] 选择的上下文节点中有一个或一个以上 title 孩子的 chapter 孩子

  • child::*[self::chapter or self::appendix] 选择上下文节点的 chapterappendix 孩子

  • child::*[self::chapter or self::appendix][position()=last()] 选择上下文节点的最后一个 chapterappendix 孩子

地址路径有两种:相对的地址路径和绝对的地址路径。

相对的地址路径由以 / 分开的一个或多个地点步进序列组成。在相对地址路径中的步进是从左到右组成。每一步进依次选择相对於上下文节点的节点集。步进的初始的序列以如下所述的方式与后续的步进组成在一起。步进的初始的序列选择相对於上下文节点的节点集,该集合的每一节点成为后续步进的上下文节点。由步进确定的节点的集合是联合在一起的。由合成的步进确定的节点的集合也是这样的联合。例如,child::div/child::para 选择了上下文节点的所有 div 元素孩子的所有 para 元素孩子,或者换句话说,选择了上下文节点中所有有以 div 为父 para 元素孙子。

绝对的地址路径由 / 及紧随其后的作为可选项的一条相对地址路径组成。 / 本身选择以包含上下文节点的文档的根节点,如果它带着相对的地址路径,该地址路径选择的节点集合则由相对於包含上下文节点的文档的根节点相对地址路径来确定。

地址路径
[1]    LocationPath    ::=    RelativeLocationPath
| AbsoluteLocationPath
[2]    AbsoluteLocationPath    ::=    '/' RelativeLocationPath?
| AbbreviatedAbsoluteLocationPath
[3]    RelativeLocationPath    ::=    Step
| RelativeLocationPath '/' Step
| AbbreviatedRelativeLocationPath

2.1 地点步进

一个地点步进有三个部分:

  • 一个轴,它指定了地点步进选择的节点与上下文节点之间树状关系,

  • 一个节点测试,它指定地点步进选择的节点的节点类型以及节点扩展名扩展名,和

  • 零个或零个以上的判定词,它使用专有的表达式进一步细化地点步进选择的节点集合。

地点步进的句法是由两个冒号分开的轴名和节点测试,其后可跟随零个或零个以上在方括符内的表达式。例如,在 child::para[position()=1] 中,child 是轴名,para 是节点测试而 [position()=1] 则是判定词。

由地点步进选择的节点集合是源于从轴和节点测试产生初始的节点集合,然后再由各个判定词的依次过滤后的节点集合。

初始的节点集合的节点组成,这些节点与上下文节点关系由轴指定的,其节点类型及扩展名由节点测试指定。例如,地点步进 descendant::para 选择上下文节点的 para 元素子孙: descendant 指定在初始的节点集合中的那每一个节点都必须是该上下文的一个子孙; para 指定在初始的节点集合中的每一个节点都必须是 para 元素。2.2 轴说明了所有可能的轴。2.3 节点测试则说明了所有可能的节点测试。一些节点测试的含意依赖于轴。

初始的节点集合由第一个判定词过滤后产生一新的节点集合,新的节点集合再由第二个判定词进行过滤,如此一直下去。最后的节点集合是由地点步进选择的节点集合。轴影响在每个判定词中的表达式怎么被求值,并且因此判定词的语义定义与轴关于。参看2.4 判定词

地点步进
[4]    Step    ::=    AxisSpecifier NodeTest Predicate*
| AbbreviatedStep
[5]    AxisSpecifier    ::=    AxisName '::'
| AbbreviatedAxisSpecifier

2.2 轴

以下是可用到的轴:

  • child 轴包含上下文节点的孩子

  • descendant 轴包含上下文节点的子孙;子孙是一个孩子或一个孩子的一个孩子,等等,这样,子孙轴从来不包含属性或命名空间节点

  • parent 轴包含上下文节点的父,如果有的话

  • ancestor 轴包含上下文节点的祖先;上下文节点的祖先由上下文节点的父以及父的父等等组成;这样,祖先轴将总是包括根节点,除非上下文节点是根节点

  • following-sibling 轴包含上下文节点的所有在其后的兄弟,如果上下文节点是属性节点或命名空间节点,following-sibling 轴则为空

  • preceding-sibling 轴包含上下文节点的所有在其前的兄弟,如果上下文节点是属性节点或命名空间节点,preceding-sibling 轴则为空

  • following 轴包含在上下文节点所在的同一文档中,所有依照文档顺序在上下文节点后的节点,但排除所有的子孙,也排除属性节点以及命名空间节点

  • preceding 轴包含在上下文节点所在的同一文档中,所有依照文档顺序在上下文节点前的节点,但排除所有的子孙,也排除属性节点以及命名空间节点

  • attribute 轴包含上下文节点的属性,除非上下文节点是元素,该轴将为空

  • namespace 轴包含上下文节点的命名空间节点,除非上下文节点是元素,该轴将为空

  • self 轴只是包含上下文节点自己

  • descendant-or-self 轴包含上下文节点和上下文节点的子孙

  • ancestor-or-self 轴包含上下文节点和上下文节点的祖先;这样,该轴将总是包括根节点

注意:

ancestordescendantfollowingpreceding 以及 self 轴划分了一个文档(忽略属性和命名空间节点):他们相互不重叠,而且他们组在一起则包含了文档所有的节点。

[6]    AxisName    ::=    'ancestor'
| 'ancestor-or-self'
| 'attribute'
| 'child'
| 'descendant'
| 'descendant-or-self'
| 'following'
| 'following-sibling'
| 'namespace'
| 'parent'
| 'preceding'
| 'preceding-sibling'
| 'self'

2.3 节点测试

定义:每个轴都有一个基本节点类型。如果轴能包含元素,基本的节点类型则是元素;否则,它的类型是轴能包含的节点的类型。]因此,

对於属性轴来说,基本的节点类型是属性。
对於命名空间轴,基本的节点类型是命名空间。
对於其它的轴,基本的节点类型是元素。

当且仅当节点的类型(参看5 数据模型)是基本类型且扩展名等於由 QName 指定的扩展名时,为 QName 节点测试才为真。例如,child::para 选择了上下文节点的 para 元素孩子,如果上下文节点没有 para 孩子,它将选择节点的一个空集合;attribute::href 选择了上下文节点的 href 属性,如果上下文节点没有 href 属性,它将选择节点的一个空集合。

使用来自表达式的上下文的命名空间声明,在节点测试里的 QName 可扩展成扩展名。这与在起始及结束标签中元素类型名称的扩展方法一样,除了缺省的 xmlns 命名空间申明无须使用外:如果 QName 没有前缀,则命名空间 URI 为空 (这与属性名字扩展的方法一样)。如果 QName 有前缀,而表达式上下文中却没有命名空间声明,则是一个错误。

对於基本节点类型的任何节点,节点测试 * 都为真。例如,child::* 将选择上下文的所有的元素孩孩子,而 attribute::* 将选择上下文节点的所有的属性。

节点测试可以用格式 NCName:*。在这种情况下,前缀就以与 QName 一样的方法被扩展,即使用上下文命名空间声明。在表达式上下文的前缀如果没有命名空间声明,则是一个错误。不论名字的局域部分,对於基本类型的任何节点,如果其扩展名有命名空间 URI 将其前缀扩展,节点测试永为真。

对於任何正文节点,节点测试 text() 为真。例如,child::text() 将选择上下文节点的正文节点孩子。同样,对於注释节点,节点测试 comment() 为真;对於处理指令,节点测试 processing-instruction() 为真; processing-instruction() 测试可以有一个字面量 Literal 的参数,在这种情况下,对於所有的处理指令,如指令名与字面量值 Literal 相等,其值为真。

对於任何节点,无论其类型,节点测试 node() 为真。

[7]    NodeTest    ::=    NameTest
| NodeType '(' ')'
| 'processing-instruction' '(' Literal ')'

2.4 判定词

一个轴不是前进轴就是倒转轴。前进轴是依文本顺序在任何时候都仅仅包含上下文节点或在上下文节点以后的节点的轴。倒转轴是依文本顺序在任何时候都仅仅包含上下文节点或在文档顺序在上下文节点前的节点的轴。因此,ancestorancestor-or-selfprecedingpreceding-sibling 轴是倒转轴;所有的其余的轴都是前进轴。由於 self 轴总是至多包含一个节点,它是前进轴或是倒转轴都不造成任何差别。轴的节点集合的成员的[定义邻近位置对前进轴是按文档顺序的节点集合是节点的位置,对倒转轴是按文档反序的节点集合是节点的位置。第一个的位置是1。]

判定词依照轴过滤节点集合来生成新的节点集合。对於被过滤的节点集合里的每节点,PredicateExpr 将该节点作为上下文节点来求值,以节点集合的节点数为上下文大小,以依照在节点集合中节点的邻近位置为上下文位置,如果对节点 PredicateExpr 的求值为真,新的节点集合就包括该节点;否则就不包括。

PredicateExpr 求值是通过先求 Expr 的值并把结果转换成布尔值而来的。如果结果是一数字且该数字与上下文位置相等,结果将被转变为真;否则为假。如果结果不是一个数字,然后结果将被变换成好像调用过函数 boolean 后的结果。这样地址路径 para[3] 等价 para[position()=3]

判定词(Predicates)
[8]    Predicate    ::=    '[' PredicateExpr ']'
[9]    PredicateExpr    ::=    Expr

2.5 缩简句法

这是一些使用缩简句法的地址路径例子:

  • para 选择上下文节点的 para 元素孩子

  • * 选择上下文节点的所有的元素孩子

  • text() 选择上下文节点的所有的正文节点孩子

  • @name 选择上下文节点的 name 属性

  • @* 选择上下文节点的所有的属性

  • para[1] 选择上下文节点的第一个 para 孩子

  • para[last()] 选择上下文节点的最后一个 para 孩子

  • */para 选择上下文节点的所有的 para 孙子

  • /doc/chapter[5]/section[2] 选择doc的第五个 chapter 的第二个 section

  • chapter//para 选择上下文节点的 chapter 元素孩子的所有 para 元素子孙

  • //para 选择文档根的所有的 para 子孙,也就是选择上下文节点所在的文档中所有的 para 元素

  • //olist/item 选择上下文节点所在的文档中所有的以 olist 为父的 item 元素

  • . 选择上下文节点

  • .//para 选择上下文节点的 para 元素子孙

  • .. 选择上下文节点的父

  • ../@lang 选择上下文节点的父的 lang 属性

  • para[@type="warning"] 选择的上下文节点的所有的有属性 type 且值为 warningpara 孩子

  • para[@type="warning"][5] 选择的上下文节点的所有的有属性 type 且值为 warningpara 孩子中的第五个

  • para[5][@type="warning"] 选择的上下文节点的第五个 para 孩子如果该节点有属性 type 且值为 warning 的话

  • chapter[title="Introduction"] 选择上下文节点的 chapter 孩子如果它有一个或多个 title 孩子且字串值Introduction

  • chpater[title] 选择的上下文节点中有一个或一个以上 title 孩子的 chpater 孩子

  • employee[@secretary and @assistant] 选择上下文节点的所有既有 secretary 属性又有 assistant 属性的 employee 孩子

最重要的缩写是 child:: 能从地点步进省略掉。实际效果上,child 是缺省轴。例如,地址路径 div/parachild::div/child::para 的缩写。

属性也有缩写形式: attribute:: 能被缩写成 @。例如,地址路径 para[@type="warning"]child::para[attribute::type="warning"] 的缩写,也就是选择有 type 属性且属性值为 warningpara 孩子。

///descendant-or-self::node()/ 的缩写。例如,//para/descendant-or-self::node()/child::para 的缩写,因此选择文档中所有的 para 元素(即使 para 元素是文档元素,也会被 //para 所选择,因为文档元素是根节点的孩子); div//paradiv/descendant-or-self::node()/child::para 的缩写,因此将选择 div 孩子的所有 para 子孙。

注意:

地址路径 //para[1] 与地址路径 /descendant::para[1] 的含意不一样,后者选择第一个 para 元素子孙,前者选择是他们的父的第一 para 孩子的所有的子孙 para 元素。

地点路进 .self::node() 的缩写。这与 // 一起使用特别有用。例如,地址路径 .//paraself::node()/descendant-or-self::node()/child::para 的缩写,因此将选择上下文节点的所有的 para 子孙元素。

同样,地址路径 ..parent::node() 的缩写。例如,../titleparent::node()/child::title 的缩写因此这将选择上下文节点的父的 title 孩子。

缩写
[10]    AbbreviatedAbsoluteLocationPath    ::=    '//' RelativeLocationPath
[11]    AbbreviatedRelativeLocationPath    ::=    RelativeLocationPath '//' Step
[12]    AbbreviatedStep    ::=    '.'
| '..'
[13]    AbbreviatedAxisSpecifier    ::=    '@'?

3 表达式

3.1 基础

VariableReference 求值成变量名是绑定到在上下文中变量绑定的集合。如果变量名没有与在上下文中变量绑定的集合中的变量绑定在一起,则是一个错误。

括号可以用于分组。

[14]    Expr    ::=    OrExpr
[15]    PrimaryExpr    ::=    VariableReference
| '(' Expr ')'
| Literal
| Number
| FunctionCall

3.2 函数调用

函数调用 FunctionCall 表达式的求值是通过使用函数名 FunctionName 在表达式求值上下文函数库中确相应的函数,求各个参数 Argument 的值,将每个参数转换成该函数所需的类型,最后,调用函数,并传递转换后的参数。如果参数的数目不对的或参数不能被变换到要求的类型,则是一个错误。

表达式 FunctionCall 的结果是由函数返回的结果。

参数被变换成字符串类型时,仿佛调用了字符串函数 string;参数被变换成数字类型时,好像调用了数字函数 number;参数被变换成布尔的类型时,好像调用了布尔函数 boolean。不是类型节点集合 node-set 的参数不能被变换成节点集合 node-set。

[16]    FunctionCall    ::=    FunctionName '(' ( Argument ( ',' Argument )* )? ')'
[17]    Argument    ::=    Expr

3.3 节点集合

地址路径能作为表达式使用。表达式返回路径所选择的节点的集合。

| 操作符计算它的操作数的并集,该并集必须是节点集合。

判定词用过滤地址路径的同样的方法来过滤表达式。如果被过滤的表达式求值不到节点集合,则是一个错误。判定词依赖于孩子轴来过滤节点集合。

注意:

判定词的意思关键地取决于应用于哪个轴。例如,preceding::foo[1] 返回在颠倒文档顺序下第一个 foo 元素,因为应用于判定词 [1] 的轴是 preceding 轴;与此相反,(preceding::foo)[1]文件顺序下返回第一个 foo,因为应用于判定词 [1] 的轴是孩子轴。

/// 操作符组成表达式及相对点路径。如果表达式求值不到节点集合,则是一个错误。/ 操作符以在地址路径中用 / 的同样方式来组成。如在地址路径中,///descendant-or-self::node()/ 的简缩。

没有对象的类型能被变换成节点集合。

[18]    UnionExpr    ::=    PathExpr
| UnionExpr '|' PathExpr
[19]    PathExpr    ::=    LocationPath
| FilterExpr
| FilterExpr '/' RelativeLocationPath
| FilterExpr '//' RelativeLocationPath
[20]    FilterExpr    ::=    PrimaryExpr
| FilterExpr 判定词

3.4 布尔

布尔类型的对象能有两个值之一:真和假。

or 表达式的求值是对每个操作数求值,并且,把它的值变换到布尔值,好像调用了布尔函数 boolean。如果值为真,其结果为真,否则,为假。如果左边的操作数求值为真,右边的操作数将不再没被求值。

and 表达式的求值是对每个操作数求值,并且,把它的值变换到布尔值,好像调用了布尔函数 boolean。如果值为真,其结果为真,否则,为假。如果左边的操作数求值为假,右边的操作数将不再没被求值。

EqualityExpr(不只是 RelationalExpr)或 RelationalExpr(不只是AdditiveExpr)是通过比较来自于对两个操作数结果的对象来求值的。以下三段话定义了结果对象的比较。一、涉及到节点集合的比较被定义按照不涉及到节点集合的比较,对 =!=<=<>=>一律如此。二、没有涉及到节点集合的比较被定义成 =!=。三、没有涉及到节点集合的比较被定义成 <=<>=>

如果被比较的两个对象是节点集合,那么,其比较结果为真当且仅当在两个节点集合中各有一个节点,并且,比较这两个节点的字串值的结果为真。如果被比较的一个对象是节点集合而另一个是数字,其比较结果为真当且仅当在节点集合中有一节点,并且,比较用函数 number 将该节点转换成的字串值的数字与被比较的数字为真。如果被比较的一个对象是节点集合而另一个是字符串,其比较结果为真当且仅当在节点集合中有一节点,并且,比较节点的字串值与另一个的字符串为真。如果被比较的一个对象是节点集合而另一个是布尔类型,其比较结果为真当且仅当在节点集合中有一节点,并且,比较用函数 boolean 将该节点转换成的布尔类型与被比较的布尔类型为真。

当两个被比较的对象都不是节点集合,而且,操作符为 =!=,那么,比较这类对象时,按以下方式将它们转换成常见类型然后再比较。如果被比较的对象中至少有一个是布尔类型,那么,每一个被比较的对象都要转换成布尔类型,正如调用了boolean 函数。不然的话,如果至少有一个是数字,那么,每一个被比较的对象都要转换成数字,正如调用了number 函数。再不然的话,两个对象都转换成字符串正如调用了string 函数。 = 的比较为真,当且仅当在对象是相等的;!= 的比较为真,当且仅当在对象是不相等的。数字相等的比较依照 IEEE 754 [IEEE 754]。两个布尔类型相等,当且仅当它们都为真或都为假。两个字符串相等,当且仅当它们都由同样序列的 UCS 字符组成。

注意:

如果 $x 绑定于一节点集合,那么,$x="foo"not($x!="foo") 的含义不同:前者为真,当且仅当在 $x有些节点有字串值为 foo ;后者前者为真,当且仅当在 $x所有节点有字串值为 foo

当两个被比较的对象都不是节点集合,而且,操作符为 =!=,那么,比较这类对象时,按以下方式将它们转换成常见类型然后再比较。如果被比较的对象中至少有一个是布尔类型,那么,每一个被比较的对象都要转换成布尔类型,正如调用了boolean 函数。不然的话,如果至少有一个是数字,那么,每一个被比较的对象都要转换成数字,正如调用了number 函数。再不然的话,两个对象都转换成字符串正如调用了string 函数。 = 的比较为真,当且仅当在对象是相等的;!= 的比较为真,当且仅当在对象是不相等的。数字相等的比较依照 IEEE 754 [IEEE 754]。两个布尔类型相等,当且仅当它们都为真或都为假。两个字符串相等,当且仅当它们都由同样序列的 UCS 字符组成。

注意:

如果 $x 绑定于一节点集合,那么,$x="foo"not($x!="foo") 的含义不同:前者为真,当且仅当在 $x有些节点有字串值为 foo ;后者前者为真,当且仅当在 $x所有节点有字串值为 foo

当两个被比较的对象都不是节点集合,而且,操作符为 <=<>=>,那么,要比较的对象都转换成数字并依照 IEEE 754 进行比较。< 的比较为真,当且仅当第一个数小於第二个数。 > 的比较为真,当且仅当第一个数大於第二个数。 >= 的比较为真,当且仅当第一个数大於或等於第二个数

注意:

当 XPath 表达式出现在 XML 文档, 所有的 <<= 操作符必须按照 XML 1.0 的规则加上引号,例如,&lt;&lt;=。在下列例子中,test 属性的值是个 XPath 表达式:

<xsl:if test="@value &lt; 10">...</xsl:if>
[21]    OrExpr    ::=    AndExpr
| OrExpr 'or' AndExpr
[22]    AndExpr    ::=    EqualityExpr
| AndExpr 'and' EqualityExpr
[23]    EqualityExpr    ::=    RelationalExpr
| EqualityExpr '=' RelationalExpr
| EqualityExpr '!=' RelationalExpr
[24]    RelationalExpr    ::=    AdditiveExpr
| RelationalExpr '<' AdditiveExpr
| RelationalExpr '>' AdditiveExpr
| RelationalExpr '<=' AdditiveExpr
| RelationalExpr '>=' AdditiveExpr

注意:

以上语法的结果是如下顺序的优先级(最低优先级先列出):

  • or

  • and

  • = , !=

  • <= , < , >= , >

并且操作符都从左结合律。

例如,3 > 2 > 1(3 > 2) > 1 等价,其求值结果为假。

3.5 数字

数字代表的是浮点数。数字可以有任何 64 位双精度格式的 IEEE 754 值[IEEE 754]。这些包括特殊的 “非数字”(NaN)值,正负无穷大,和正负零。参看标准[JLS]的4.2.3 节关键规则的概要。

数字操作符将操作数转换成数字,仿佛调用了函数number

操作符 + 执行加法。

操作符 - 执行减法。

注意:

由於 XML 允许 - 出现在名字中,典型地需要有空白符在 - 操作符之前。例如,foo-bar 求值结果为一个包含名为 foo-bar 的孩子的节点集合;foo - bar 求值结果是把第一个子元素 foo 字串值转换成数字的结果和把第一个bar 孩子的 字串值转换成数字的结果的差。

div 操作符按照 IEEE 754 执行浮点数的除法。

mod 操作符返回去尾除法的余。例如:

  • 5 mod 2 返回 1

  • 5 mod -2 返回 1

  • -5 mod 2 返回 -1

  • -5 mod -2 返回 -1

注意:

这与 Java 和ECMAScript 中的 % 操作符一样。

注意:

这与 IEEE 754 中返回取整 除的余操作不一样。

数字表达式
[25]    AdditiveExpr    ::=    MultiplicativeExpr
| AdditiveExpr '+' MultiplicativeExpr
| AdditiveExpr '-' MultiplicativeExpr
[26]    MultiplicativeExpr    ::=    UnaryExpr
| MultiplicativeExpr MultiplyOperator UnaryExpr
| MultiplicativeExpr 'div' UnaryExpr
| MultiplicativeExpr 'mod' UnaryExpr
[27]    UnaryExpr    ::=    UnionExpr
| '-' UnaryExpr

3.6 字符串

字符串由一个有零或多个在 XML 建议书[XML]定义的字符的序列组成。因此,在 XPath 中一个单字符对应于一单个有相应 Unicode 数值的 Unicode 抽象字符(参看[Unicode]);这与 16-位的 Unicode 编码值不是同一件事:Unicode 编码字符代表 Unicode 数值大於 U+FFFF 的抽象字符是一对 16-位 Unicode 编码值 (替代对surrogate pair)。在许多的编程语言,字符串由一序列 Unicode 编码值来表示;在这样的语言中 XPath 的实现必须考虑确保替代对被正确地处理成一个单一的 XPath 字符。

注意:

在 Unicode 可能会出现两个字符串被当作同样的, 即使它们由不同的Unicode 抽象字符序列组成。例如,有些重音字符可以由预制的或分解的形式来表示。因此,XPath 可能会返回预想不到的结果,除非这些在 XPath 表达式及 XML 文档的字符被规范化成规范的形式。参见[Character Model]。

3.7 词法结构

当进行分割(tokenizing)时, 总是返回最长的分割段(token)。

尽管语法中没有明确的允许,为了可读性表达式可以使用空白符:ExprWhitespace 可以在所有 ExprToken 式样(pattern)前后自由地添加。

以下特别的分割规则的使用必须按照说明的顺序来应用以消除 ExprToken 的歧义:

表达式的词法结构
[28]    ExprToken    ::=    '(' | ')' | '[' | ']' | '.' | '..' | '@' | ',' | '::'
| NameTest
| NodeType
| Operator
| FunctionName
| AxisName
| Literal
| Number
| VariableReference
[29]    Literal    ::=    '"' [^"]* '"'
| "'" [^']* "'"
[30]    Number    ::=    Digits ('.' Digits?)?
| '.' Digits
[31]    Digits    ::=    [0-9]+
[32]    Operator    ::=    OperatorName
| MultiplyOperator
| '/' | '//' | '|' | '+' | '-' | '=' | '!=' | '<' | '<=' | '>' | '>='
[33]    OperatorName    ::=    'and' | 'or' | 'mod' | 'div'
[34]    MultiplyOperator    ::=    '*'
[35]    FunctionName    ::=    QName - NodeType
[36]    VariableReference    ::=    '$' QName
[37]    NameTest    ::=    '*'
| NCName ':' '*'
| QName
[38]    NodeType    ::=    'comment'
| 'text'
| 'processing-instruction'
| 'node'
[39]    ExprWhitespace    ::=    S

4 核心函数库

本节描述用来求值表达式的函数, XPath的实现必须总是在函数库中包括这些函数。

在函数库中的每一个函数都使用一个函数原型,该原型给定返回类型,函数的名称,以及参数的类型。如果参数类型后跟随一个问号,那么参数是可选的;否则,参数则是必须有的。

4.1 节点集合函数

number last()

last 函数返回一个数字,该数字等於从表达式求值上下文中的上下文大小

number position()

position函数返回一个数字,该数字等於从表达式求值上下文中的上下文位置

number count(node-set)

count 函数返回在参数node-set中节点的个数。

node-set id(object)

id 函数id通过元素的唯一的ID选择他们(参见 5.2.1 唯一 ID)。当id的参数是节点集合类型时,结果是对在参数节点集合里的每一个节点的字串值应用id的结果的联合。当到id的参数是任何其它的类型时,参数被转换成一个字符串,即如调用了string 函数一样;字符串被分割成由空白格分开的单字片序列(空白格是与产生式 S匹配的字符的任何顺序);结果是在上下文节所在的同一文档中那些具有唯一id等於序列中任何一个单字片的元素的节点集合。

  • id("foo") 选择唯一ID为 foo 元素

  • id("foo")/child::para[position()=5] 选择唯一带有 ID 为 foo 的元素的第5个 para 孩子

string local-name(node-set?)

函数 local-name 返回一个节点的扩展名的局域部分,该节点为依照文档顺序参数节点集合里的第一个节点。如果参数节点集合是空或第一节点没有扩展名,则返回一个空字符串。如果参数被省略,它则缺省为仅有一个上下文节点成员的节点集合。

string namespace-uri(node-set?)

函数 namespace-uri 返回依照文档顺序参数节点集合中的第一个节点的扩展名的命名空间 URI。如果参数节点集合是空的,第一节点没有扩展名,或扩展名的命名空间 URI 为空,则返回一个空字符串。如果参数被省略,它则缺省为仅有一个上下文节点成员的节点集合。

注意:

除了元素节点和属性节点外函数 namespace-uri 返回的字符串将为空。

string name(node-set?)

函数 name 返回一个字符串,字符串包含一个QName,它代表依照文档顺序参数节点集合中的第一个节点的扩展名QName代表扩展名字时,必须注意到命名空间声明实际上是对被表示的扩展名的节点的。典型地,在XML资源中将是 QName 出现。如果命名空间声明实际上是对与有同样命名空间的多重的前缀相联系的节点,这不必是实际上的情况。然而,实现可以包括有关节点的表示的原来前缀的信息;在这样的情况下,实现能保证返回的字符串总是与在 XML 文档使用的QName一样。如果参数节点集合是空的或第一节点没有扩展名,返回一个空的字符串。如果它省略了的参数,则缺省为仅有上下文节点一个成员的节点集合。

注意:

除了元素节点和属性节点外,由 name 函数返回的字符串将与 local-name 函数返回的字符串一样。

4.2 字符串函数

string string(object?)

string 函数将对象依下列各项转换成字符:

  • 节点集合通过返回在节点集合中文档顺序下第一个节点的字串值来转换成字符串。如果节点是空的则返回空字符串。

  • 数字按以下方式转换成字符

    • NaN 转换成字符串 NaN

    • 正零转换成字符串 0

    • 负零转换成字符串 0

    • 正无穷大转换成字符串 Infinity

    • 负无穷大转换成字符串 -Infinity

    • 如果数字是整数,该数字表示成一个与无小数点及领头零的 Number一样的十进制的形式,如果数字是负数,则在其前加一个负号(-)。

    • 否则,该数字表示成一个与包括小数点及至少在小数点前面有一数字并且小数点后有一数字的 Number一样的十进制的形式,如果数字是负数,则在其前加一个负号(-);除了在小数点前要求直接要有一个位的零外,不应该有领头的零;在小数点后除了要求的一位数外,应有不多不少的位来区分该数与所有其它的 IEEE 754 数值。

  • 布尔的假值转换成字符串 false。布尔的真值转换成字符串 true

  • 不是四种基本类型的对象依照所属类型的方式转换成字符串。

如果参数省略,则缺省为仅有一个上下文节点为成员的节点集合。

注意:

string 函数不是要用来将数字转换成字符串呈现给用户的。 format-number 函数和[XSLT] 中的 xsl:number 元素提供了这样的功能。

string concat(string, string, string*)

concat 函数返回它的参数的联结。

boolean starts-with(string, string)

如果第一个字符串参数以第二个字符串参数起头,starts-with 函数返回真,否则,返回假。

boolean contains(string, string)

如果第一个字符串参数包含第二个字符串参数,contains 函数返回真,否则,返回假。

string substring-before(string, string)

substring-before 函数返回第一个字符串参数在第二个参数首次出现之前的子字符串,或者,如果第一个字符串参数不包含第二个字符串参数则返回空字符串。例如,substring-before("1999/04/01","/") 返回 1999

string substring-after(string, string)

substring-after 函数返回第一个字符串参数在第二个参数首次出现之后的子字符串,或者,如果第一个字符串参数不包含第二个字符串参数则返回空字符串。例如, substring-after("1999/04/01","/") 返回 04/01,而 substring-after("1999/04/01","19") 返回 99/04/01

string substring( string , number , number? )

substring 函数返回第一个字符串参数从第二个参数所指定的位置开始,以第三个参数为长度的子字符串。例如, substring("12345",2,3) 返回 "234"。如果没有第三个参数,则返回从第二个参数所指定的位置开始直到结束。例如, substring("12345",2) 返回"2345"

更确切地说,每一个字符串里的字符(参看3.6 字符串)是被看作有一个数字位置:第一个字符是 1 ,第二个字符是 2 ,依此类推。

注意:

这与 Java 和 ECMAScript 不同,在 Java 和 ECMAScript 中 String.substring 方法将第一个字符的位置当成 0 。

该返回的子字符串包含那些字符位置大於或等於第二参数的取整值,如果指定了第三个参数,则小於第二和第三个参数的取整值之和;以上的比较和加法遵循 IEEE 754 的规则;取整操作仿佛是调用了round 函数。以下的例子说明了各种不常见的案例:

  • substring("12345", 1.5, 2.6) 返回 "234"

  • substring("12345", 0, 3) 返回 "12"

  • substring("12345", 0 div 0, 3) 返回 ""

  • substring("12345", 1, 0 div 0) 返回 ""

  • substring("12345", -42, 1 div 0) 返回 "12345"

  • substring("12345", -1 div 0, 1 div 0) 返回 ""

number string-length( string? )

string-length 返回字符串(参看 3.6 字符串)中字符的个数。如果参数省略,则缺省为一个上下文节点再转换成字符串,也就是上下文节点的 字串值

string normalize-space(string?)

normalize-space 函数返回空白符规范化 后的参数字符串,该规范化是清除领头及结尾的空白字以及用一个空白符替换连续的空白符。空白符字符与 XML 中的产生式 S 所允许的是一样的。如果参数省略,则缺省为一个上下文节点再转换成字符串,也就是上下文节点的 字串值

string translate(string, string, string)

translate 函数返回第一个参数的字符串,其中有在第二个参数中出现的字符都被在第三个参数中相对应位置的字符所替换。例如,translate("bar","abc","ABC") 返回字符串 BAr。如果,第二个参数里的字符在第三个参数的相对应位置没有字符(因为第二个参数里的字符串比第三个参数的字符串长),那么,第一个参数里的那个字符将被移去。例如,translate("--aaa--","abc-","ABC") 返回 "AAA"。如果在第二个参数里的字符出现超过一次,那么,第一次的出现决定替换的字符。如果第三个参数里的字符串比第二个参数的字符串长, 那么,多余的字符将被忽略。

注意:

translate 函数不是一个对所有语言大小写转换的完整解决方案。XPath 的将来的版本可能会为大小写转换提供额外的函数。

4.3 布尔函数

boolean boolean(object)

boolean 函数依下列各项转换其参数:

  • 数字为真当且仅当它不是正负零或 NaN

  • 节点集合为真当且仅当它不为空

  • 字符串为真当且仅当它的长度不为零

  • 不是四种基本类型的对象依照所属类型的方式转换成布尔类型。

boolean not(boolean)

如果参数为真 not 函数返回真,否则返回假。

boolean true()

true 函数返回真。

boolean false()

The false 函数返回假。

boolean lang(string)

依赖于 xml:lang 属性指定的上下文节点的语言与参数指定的语言的子语言是否一致或一样,参数字符串lang函数返回真或假。上下文节点的语言由上下文节点的 xml:lang 属性决定,或者,如果没有 xml:lang 属性则由最接近的有 xml:lang 属性祖先节点的 xml:lang 属性值决定。如果没有这样的节点,那么 lang 返回假。如果有这样的节点,那么在不考虑大小的情况下,当属性值写与参数相等或有以- 开始的后缀且其值等於参数忽略后缀的值,lang 返回真。如果上下文节点为以下五个元素中的任何一个,lang("en") 为真:

<para xml:lang="en"/>
            <div xml:lang="en"><para/></div>
            <para xml:lang="EN"/>
            <para xml:lang="en-us"/>

4.4 数字函数

number number(object?)

number 函数参数依下列各项转换成数字:

  • 可选的空白符跟随可选的减号再跟随 Number 再跟随空白符的字符串转换成 IEEE 754 最接近的 (根据 IEEE 754 就近取整规则) 由字符串表示的数学值的数字;其它任何的字符串转换成 NaN

  • 布尔真转换成 1 ;布尔假转换成 0

  • 节点集合首先转换成字符串好像调用了 string 函数,然后再按字符串参数的方式转换

  • 不是四种基本类型的对象依照所属类型的方式转换成数字。

如果参数省略,则缺省为仅有一个上下文节点为成员的节点集合。

注意:

除非元素是在语言自然格式(典型地被改变成语言特定的格式呈现给用户)下代表数字数据的类型,number 函数不应用于 XML 文档元素中的数字转换。另外,除非语言自然格式与 XPath 句法的 Numbernumber 函数不能使用。

number sum(node-set)

对於在参数节点集合的每个节点,sum 函数返回节点字串值转换成数字后的和。

number floor(number)

floor 函数返回不大於参数的整数的最大数 (最接近于正无穷大) 。

number ceiling(number)

ceiling 函数返回不小於参数的整数的最小数 (最接近于负无穷大) 。

number round(number)

round 函数返回最接近于参数的整数。如果有两个这样的数字,那么,返回最接近于正无穷大的那个。如果参数是 NaN,那么返回 NaN。如果参数是正无穷大,那么返回正无穷大。如果参数是负无穷大,那么返回负无穷大。如果参数是正零,那么返回正零。如果参数是负零,那么返回负零。如果参数小於零,但大於或等於 -0.5 ,那么返回负零。

注意:

对於最后两种情况,调用round 函数与加上 0.5 后并调用 floor的结果不同。

5 数据模型

XPath 将一个 XML 文档作为一棵树进行操作。本节描述 XPath 怎样将一个 XML 文档建成一棵树的模型。该模型仅仅是概念上的并且不要求任何特定实现。在B XML 信息集映射中描述了该模型与 XML 信息集[XML Infoset

被 XPath 操作的 XML 文档必须遵循XML 命名空间建议书[XML Names]。

树包含节点,共有7种节点类型:

  • 根节点

  • 元素节点

  • 正文节点

  • 属性节点

  • 命名空间节点

  • 处理指令节点

  • 注释节点

定义:对於每种节点类型,都有一个方法来决定该类型的节点的字串值。对一些节点,字串值是节点的一部分;对於其它节点,字串值的计算是由子孙节点的字串值来求出。]

注意:

对於元素节点和根节点,节点的字串值不与 DOM 的 nodeValue 方法返回了的字符串一样(参看[DOM])。

定义:一些节点的类型也有扩展名,它是由局域部分和命名空间 URI 对组成。局域部分是一个字符串。命名空间 URI 或为空或为一字符串。在 XML 文档中说明的命名空间 URI 可以是一个在[RFC2396]中定义的 URI 引用;这意味着它能有一个片段标识符并可以是相对的。在处理的命名空间时,一个相对的 URI 应该被转换成绝对的 URI:在数据模型中节点扩展名的命名空间 URIs 应该是绝对的。]如果两个扩展名有一样的局域部分,且都或有一空的命名空间 URI 或都有是相等的非空的命名空间 URI ,那么它们是相等的。

定义文档顺序是对文档中所有的节点定义的一个顺序, 该顺序对应于在一般的实体的扩展以后,每个节点的 XML 表示的首字符出现在文档 XML 表示中的顺序。这样,根节点将是第一个节点。元素节点出现在他们的孩子前面。因此,文档顺序制定了元素节点以在 XML (实体扩展后)中开始标签出现的顺序为顺序。元素的属性节点和命名空间节点出现在元素的孩子们前面。命名空间节点定义出现在属性节点前。命名空间节点的相对顺序是依赖于实现。属性节点的相对的顺序是实现依赖的。] [定义文档倒顺文档顺序的颠倒。]

根节点和元素节点有子节点的有序表。节点从来不共享孩子:如果一节点与另一节点不是同样的节点,那么,没有一个节点的孩子与另一节点的任何一个孩子会是同一节点。[定义:除根节点以外,每个节点严格地只有一个],它是一元素节点或根节点。根节点或元素节点是每一个它的孩子节点的父。[定义:节点的子孙是该节点的孩子们和节点的孩子们的子孙。]

5.1 根节点

根节点为树的根。除了作为树的根,根节点并不出现。文档元素的元素节点是根节点的孩子。出现在序言中和文档元素后的处理指令及注释也为根节点的子处理指令及注释节点。

根节点的字串值 是根节点在文本顺序下所有文字节点子孙字串值的累加。

根节点没有扩展名

5.2 元素节点

在文档中的每个元素都有一个元素节点。元素节点有扩展名, 该扩展名的确定是通过扩展按照 XML 命名空间建议书[XML Names]在标记中指定元素的QName。 如果QName没有前缀并且无可应用的缺省的命名空间,元素扩展名的命名空间 URI 为空。

注意:

依照[XML Names]附录A.3中的注释,扩展名的局部部分对应于 ExpEType 元素的 type 属性;扩展名的命名空间 URI 对应于 ExpEType 元素的 ns 属性,并且如果 ExpEType 元素的 ns 属性被省略,扩展名的命名空间 URI 为空。

元素节点的孩子是元素节点,注释节点,处理节点及其内容的文字节点。对内部及外部实体的实体引用将被扩展,字符引用也被解决。

元素节点的字串值是元素节点在文本顺序下所有文字节点子孙字串值的累加。

5.2.1 唯一 ID

元素节点可以有 一个唯一标识符(ID),它是在DTD中声明为类型 ID 的属性的值。在同一文档中,没有两个元素可以有相同的唯一标识符。如果 XML 处理器在同一文档中发现两个元素有相同的唯一标识符(如果该文档是无效的,这样的情形可能发生),那么,在文本顺序下的第二个元素将被视为没有唯一标识符。

注意:

如果一个文档没有DTD,那么,在该文档中没有元素将有唯一标识符。

5.3 属性节点

每一个元素节点都有相关联的属性节点集;元素是每一个这些属性节点的节点;然而,属性节点不是它父元素的孩子。

注意:

这与 DOM 不同,DOM 不认为元素拥有属性当做属性的父 (参看[DOM])。

元素从来不分享属性节点:如果一节点与另一节点不是同样的节点,那么,没有一个元素节点的属性节点会是另一节点的属性节点。

注意:

操作符 = 测试两个节点是否有一样的值,不是他们是否是同一节点。这样,两个不同的元素的属性可以使用 = 比较,尽管他们不是一样的节点。

对待缺省属性与指定的属性一样。如果属性申明在DTD中元素类型,而缺省申明为 #IMPLIED,并且,在元素中没有给出该属性,那么,元素的属性集合不包含该属性节点。

一些属性,如 xml:langxml:space,除非被其他的子孙元素中的相同属性替换,从语义上它们应用于所有有该属性的元素的子孙元素。然而,这不影响属性节点在树里出现的位置:在元素的开始标签或该元素的空元素标签中明确地指定的,或在DTD中明确地声明缺省值的那些属性才是该元素拥有的属性节点。

属性节点有扩展名字串值扩展名的确定是根据 XML 命名空间建议书[XML Names],通过扩展 XML 文档标签中指定的QName而得到的。如果属性的QName没有前缀,属性的名的命名空间 URI 将为空。

注意:

依照[XML Names]附录A.3中的注释,扩展名 expanded-name 的局部部分对应于 ExpAName 元素的 name 属性;扩展名 expanded-name 的命名空间 URI 对应于 ExpEType 元素的 ns 属性,并且,如果 ExpAName 元素的 ns 属性被省略,扩展名的命名空间 URI 为空。

属性节点有字串值字串值是在 XML 建议书[XML]详细说明的规范化的值。对其规范化值是零长度字符串的属性无须分别处理:它以字串值是零长度字符串的属性节点为结果。

注意:

也可能在外部的DTD或外部的参数实体中声明缺省属性。除非正在进行校验,XML 建议书不要求 XML 处理器读外部的DTD或外部的参数。样式表或其它假设 XPath 树包含有在外部的DTD或外部的参数中申明缺省属性值的功能软件不能与一些无校验 XML 处理器一起工作。

没有属性节点与声明命名空间的属性相对应(参看[XML Names])。

5.4 命名空间节点

每个元素都有命名空间节点的关联的集合,一个为在元素的范围的每个不同命名空间前缀(包括 xml 前缀,它由 XML 命名空间建议书[XML Names]隐式地声明);而如果在对元素的范围,另一个是为缺省命名空间。元素是这些命名空间节点的;然而,一个命名空间节点不是它的父元素的孩子。元素从来不分享命名空间节点:如果一个元素节点与另外的元素不是一样的节点,那么,没有一个元素节点的命名空间节点会是另一元素节点的命名空间节点。这意味着一个元素将有一个命名空间节点:

  • 对每个以 xmlns: 开始的元素的属性;

  • 对每个以 xmlns: 开始的祖先元素的属性,除非元素自己或一位更近的祖先重新声明了该前缀;

  • xmlns 属性,如果该元素或一些祖先有 xmlns, 并且,对最接近的这样的元素 xmlns 属性的值是非空的。

    注意:

    属性 xmlns="" “未申明”缺省命名空间(参看[XML Names])。

命名空间节点有扩展名:其局域部分是命名空间前缀(如果命名空间节点为缺省命名空间,则为空);命名空间 URI 总为空。

命名空间节点的字串值是被绑定在命名空间前缀的命名空间 URI;如果它是相对的,它必须被解析,就象在扩展名中的命名空间 URI 扩展名字。

5.5 处理指令节点

除了在文档类型声明中出现的所有处理指令外,每个处理指令都有处理指令节点。

每条处理指令都有扩展名: 其局域部分是处理指令的目标;其命名空间 URI 为空。处理指令节点的字串值是处理指令后跟随的目标及任何空白的部分,不包括结尾的 ?>

注意:

XML 声明不是一条处理指令,因此,没有处理指令节点与 XML 声明相对应。

5.6 注释节点

除了在文档类型声明中出现的所有注释外,每条注释都有注释节点。

注释的字串值是注释的内容而不包括 起始的 <!-- 是或结尾的 -->

注释节点没有扩展名

5.7 正文节点

字符数据组成正文节点。尽可能多的字符数据被组织进正文节点:从来没有一个正文节点的后面或前面紧连的兄弟是个正文节点。正文节点的字串值是它的字符数据。正文节点总是至少有一个字符的数据。

在 CDATA 节内的每个字符都被当作字符数据,这样,在源文档的 <![CDATA[<]]>&lt; 都看成是一样的,都是在树中正文节点的一个单字符 <。这样,CDATA 节被看成好像把 <![CDATA[]]> 拿掉,而且,每次出现的 <& 都被分别地替换成 &lt;&amp;

注意:

当正文节点包含< 字符作为 XML 输出,< 字符必须转码,例如使用 &lt;,或包含在 CDATA 节中。

注释、处理指令和属性值中的字符不产生正文节点。外部实体中的行结束符都按 XML 建议书[XML]规范化成 #xA 。

正文节点没有扩展名

6 一致性

XPath的根本计划是作为一个组件,为其它的规格书所使用。因此,XPath依赖于使用XPath的说明书(例如[XPointer]和[XSLT])来指定XPath的实现一致性标准,并且不为XPath的独立的实现定义任何一致性标准。

A 参考书目

A.1 标准规范参考书目

IEEE 754
Institute of Electrical and Electronics Engineers. IEEE Standard for Binary Floating-Point Arithmetic. ANSI/IEEE Std 754-1985.
RFC2396
T. Berners-Lee, R. Fielding, and L. Masinter. Uniform Resource Identifiers (URI): Generic Syntax. IETF RFC 2396. See http://www.ietf.org/rfc/rfc2396.txt.
XML
World Wide Web Consortium. Extensible Markup Language (XML) 1.0. W3C Recommendation. See http://www.w3.org/TR/1998/REC-xml-19980210
XML Names
World Wide Web Consortium. Namespaces in XML. W3C Recommendation. See http://www.w3.org/TR/REC-xml-names Also see: 中文翻译 [简体中文] .

A.2 其他参考书目

Character Model
World Wide Web Consortium. Character Model for the World Wide Web. W3C Working Draft. See http://www.w3.org/TR/WD-charmod
DOM
World Wide Web Consortium. Document Object Model (DOM) Level 1 Specification. W3C Recommendation. See http://www.w3.org/TR/REC-DOM-Level-1
JLS
J. Gosling, B. Joy, and G. Steele. The Java Language Specification. See http://java.sun.com/docs/books/jls/index.html.
ISO/IEC 10646
ISO (International Organization for Standardization). ISO/IEC 10646-1:1993, Information technology -- Universal Multiple-Octet Coded Character Set (UCS) -- Part 1: Architecture and Basic Multilingual Plane. International Standard. See http://www.iso.ch/cate/d18741.html.
TEI
C.M. Sperberg-McQueen, L. Burnard Guidelines for Electronic Text Encoding and Interchange. See http://etext.virginia.edu/TEI.html.
Unicode
Unicode Consortium. The Unicode Standard. See http://www.unicode.org/unicode/standard/standard.html.
XML Infoset
World Wide Web Consortium. XML Information Set. W3C Working Draft. See http://www.w3.org/TR/xml-infoset
XPointer
World Wide Web Consortium. XML Pointer Language (XPointer). W3C Working Draft. See http://www.w3.org/TR/WD-xptr
XQL
J. Robie, J. Lapp, D. Schach. XML Query Language (XQL). See http://www.w3.org/TandS/QL/QL98/pp/xql.html
XSLT
World Wide Web Consortium. XSL Transformations (XSLT). W3C Recommendation. See http://www.w3.org/TR/xslt

B XML 信息集映射(非标准)

在 XPath 数据模型中的节点可按如下方式由 XML 信息集 [XML Infoset] 提供的信息项导出: [XML Infoset] as follows:

注意:

在XPath 本版本的准备完成的时候,即将替换五月17日版本的新版本的 XML 信息集工作草稿已接近完成,或将与本版的本规范同时发表或稍后发表。这里所给出的映射是按照新的 XML 信息集工作草稿。如果,XML 信息集工作草稿还没有发表,W3C 成员可参考内部的工作草稿版 http://www.w3.org/XML/Group/1999/09/WD-xml-infoset-19990915.html只有成员可访问).

  • 根节点来自文档的信息项。根节点的孩子来自 childrenchildren - comments 属性。

  • 元素节点来自元素信息项。元素节点的孩子来自 childrenchildren - comments 属性。元素节点的属性来自 attributes 属性。元素节点的命名空间来自 in-scope namespaces 属性。元素节点扩展名的局域部分来自 local name 属性。元素节点扩展名的命名空间 URI 来自 namespace URI 属性。元素节点的唯一 ID 来自有 attribute type 属性等於 IDattributes 属性的属性信息项的children 属性.

  • 属性节点来自属性信息项。属性节点扩展名的局域部分来自local name 属性。属性节点扩展名的命名空间 URI 来自 namespace URI 属性。 节点的 字串值 来自将 每一个children 属性成员的 character code 属性相累加。

  • 正文节点来自一序列的连续的信息项。其节点的字串值来自连接每一个字符信息项 character code 属性。.

  • 处理指令节点来自处理指令的信息项。其扩展名的局域部分来自 target 属性。(其扩展名的命名空间 URI 部分为空。)其字串值来自content 属性。文档类型定义信息项的孩子是处理指令项的无处理指令节点。

  • 注释节点来自注释信息项。其字串值来自content 属性。文档类型定义信息项的孩子是注释信息项的无注释节点。

  • 命名空间节点来自命名空间声明信息项。其扩展名的局域部分来自prefix 属性。(其扩展名的命名空间 URI 部分为空。)其字串值来自命名空间 URI 属性。.

posted @ 2006-10-18 13:38  横渡  阅读(1118)  评论(0编辑  收藏  举报