|
XML 路径语言(XPath) 版本 1.0万维网协会 (W3C) 建议 1999November16
Copyright © 1999 W3C® (MIT, INRIA, Keio), All Rights Reserved. W3C liability, trademark, document use, and software licensing rules apply. 摘要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 绪论 附录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 种基本的类型之一:
表达式求值发生与上下文有关。XSLT 和 XPointer 分别地指定了上下文怎样在 XSLT 和 XPointer 使用 XPath 表达式。上下文组成包括:
上下文位置总是小於或等於上下文的大小。 绑定由从变量名到变量值映射组成,一个变量的值是一个对象,它的类型可以是任何表达式的值可能的类型,并且也可以有这里没指定的另外的类型。 函数库由从函数名到函数的映射组成,每个函数可接受零个或零个以上的参数并且返回单个的结果。本文档定义了所有的 XPath 实现必须支持的一个核心函数库(参看4 核心函数库)。对於核心函数库中的每一个函数,参数和结果有4种基本的类型。XSLT 和 XPointer 通过定义另外的函数来扩展 XPath 的函数;这些函数有些对 4 种基本的类型操作,其它的则对 XSLT 和 XPointer 定义的另外的数据类型操作。 命名空间声明由从前缀到命名空间 URI 的映射组成。 变量绑定、函数库及命名空间声明对於求表达式或其子表达式的值总是一样的;上下文节点、上下文位置及大小对於求表达式或其子表达式的值则是不同的。有多种表达式可改变上下文节点,而只有判定词能改变上下文位置和上下文大小(参看2.4 判定词)。在描述一种表达式的求值时,必须总是明确地说明是上下文节点、上下文位置、还是上下文的大小对子表达式的求值产生变化,如果没有关于上下文节点、上下文位置、上下文的大小的说明,那么对那种表达式的子表达式的求值就保持不变。 XPath 表达式经常出现在 XML 属性里,在本节中说明的语法适用于在 XML 1.0 规范化以后的属性值。因此,如果语法要使用字符
一种重要的表达式类型是地点路径,地址路径选择与上下文节点相关的节点集合。对是地址路径的表达式求值的结果是节点集合,该节点集合包含地点路径选择的节点。地址路径能递归地包含表达式,这些表达式用来过滤节点集合。地址路径与此同时LocationPath 相匹配。 在下列语法里,非终结的 QName 和 NCName 定义在[XML Names]中,而S定义在[XML]中。语法与[XML]一样使用 EBNF 符号表示法(除了总是以大写字母起头的语法符号)。 分析表达式时,首先将字符字符串分解成分割段(token),然后再分析所得分割段结果的序列。空白符能自由地在分割段之间被使用。分段化(tokenization)过程在3.7 词法结构中描述。 2 地址路径尽管地址路径不是本语言中最完整的语法的构件(地址路径 LocationPath 是 Expr 的一个特殊的例子),他们却是最重要的构件,因此,将首先进行描述。 每一条地址路径都能使用直观但是相当冗长的句法表示,同时也有很多缩简句法可用以简明地表示常见路径。这节将解释使用未经缩写的句法的地址路径的语义。然后将通过显示缩简的句法怎扩展成未经缩写的句法来解释缩简句法(看2.5 缩简句法)。 这是使用未经缩写的句法的地址路径的一些例子:
地址路径有两种:相对的地址路径和绝对的地址路径。 相对的地址路径由以 绝对的地址路径由 地址路径
2.1 地点步进一个地点步进有三个部分:
地点步进的句法是由两个冒号分开的轴名和节点测试,其后可跟随零个或零个以上在方括符内的表达式。例如,在
由地点步进选择的节点集合是源于从轴和节点测试产生初始的节点集合,然后再由各个判定词的依次过滤后的节点集合。 初始的节点集合的节点组成,这些节点与上下文节点关系由轴指定的,其节点类型及扩展名由节点测试指定。例如,地点步进
初始的节点集合由第一个判定词过滤后产生一新的节点集合,新的节点集合再由第二个判定词进行过滤,如此一直下去。最后的节点集合是由地点步进选择的节点集合。轴影响在每个判定词中的表达式怎么被求值,并且因此判定词的语义定义与轴关于。参看2.4 判定词。 地点步进
2.2 轴以下是可用到的轴:
注意:
轴
2.3 节点测试[定义:每个轴都有一个基本节点类型。如果轴能包含元素,基本的节点类型则是元素;否则,它的类型是轴能包含的节点的类型。]因此,
当且仅当节点的类型(参看5 数据模型)是基本类型且扩展名等於由
QName 指定的扩展名时,为
QName 节点测试才为真。例如, 使用来自表达式的上下文的命名空间声明,在节点测试里的 QName 可扩展成扩展名。这与在起始及结束标签中元素类型名称的扩展方法一样,除了缺省的 xmlns 命名空间申明无须使用外:如果 QName 没有前缀,则命名空间 URI 为空 (这与属性名字扩展的方法一样)。如果 QName 有前缀,而表达式上下文中却没有命名空间声明,则是一个错误。 对於基本节点类型的任何节点,节点测试 * 都为真。例如, 节点测试可以用格式
NCName 对於任何正文节点,节点测试 对於任何节点,无论其类型,节点测试
2.4 判定词一个轴不是前进轴就是倒转轴。前进轴是依文本顺序在任何时候都仅仅包含上下文节点或在上下文节点以后的节点的轴。倒转轴是依文本顺序在任何时候都仅仅包含上下文节点或在文档顺序在上下文节点前的节点的轴。因此, 判定词依照轴过滤节点集合来生成新的节点集合。对於被过滤的节点集合里的每节点,PredicateExpr 将该节点作为上下文节点来求值,以节点集合的节点数为上下文大小,以依照在节点集合中节点的邻近位置为上下文位置,如果对节点 PredicateExpr 的求值为真,新的节点集合就包括该节点;否则就不包括。 对 PredicateExpr 求值是通过先求
Expr
的值并把结果转换成布尔值而来的。如果结果是一数字且该数字与上下文位置相等,结果将被转变为真;否则为假。如果结果不是一个数字,然后结果将被变换成好像调用过函数
判定词(Predicates)
2.5 缩简句法这是一些使用缩简句法的地址路径例子:
最重要的缩写是 属性也有缩写形式:
注意: 地址路径 地点路进 同样,地址路径 缩写
3 表达式3.1 基础VariableReference 求值成变量名是绑定到在上下文中变量绑定的集合。如果变量名没有与在上下文中变量绑定的集合中的变量绑定在一起,则是一个错误。 括号可以用于分组。
3.2 函数调用函数调用 FunctionCall 表达式的求值是通过使用函数名 FunctionName 在表达式求值上下文函数库中确相应的函数,求各个参数 Argument 的值,将每个参数转换成该函数所需的类型,最后,调用函数,并传递转换后的参数。如果参数的数目不对的或参数不能被变换到要求的类型,则是一个错误。 表达式 FunctionCall 的结果是由函数返回的结果。 参数被变换成字符串类型时,仿佛调用了字符串函数
3.3 节点集合地址路径能作为表达式使用。表达式返回路径所选择的节点的集合。
判定词用过滤地址路径的同样的方法来过滤表达式。如果被过滤的表达式求值不到节点集合,则是一个错误。判定词依赖于孩子轴来过滤节点集合。 注意: 判定词的意思关键地取决于应用于哪个轴。例如,
没有对象的类型能被变换成节点集合。
3.4 布尔布尔类型的对象能有两个值之一:真和假。
EqualityExpr(不只是
RelationalExpr)或
RelationalExpr(不只是AdditiveExpr)是通过比较来自于对两个操作数结果的对象来求值的。以下三段话定义了结果对象的比较。一、涉及到节点集合的比较被定义按照不涉及到节点集合的比较,对
如果被比较的两个对象是节点集合,那么,其比较结果为真当且仅当在两个节点集合中各有一个节点,并且,比较这两个节点的字串值的结果为真。如果被比较的一个对象是节点集合而另一个是数字,其比较结果为真当且仅当在节点集合中有一节点,并且,比较用函数
当两个被比较的对象都不是节点集合,而且,操作符为 注意: 如果 当两个被比较的对象都不是节点集合,而且,操作符为 注意: 如果 当两个被比较的对象都不是节点集合,而且,操作符为 注意: 当 XPath 表达式出现在 XML 文档, 所有的
注意: 以上语法的结果是如下顺序的优先级(最低优先级先列出):
并且操作符都从左结合律。 例如, 3.5 数字数字代表的是浮点数。数字可以有任何 64 位双精度格式的 IEEE 754 值[IEEE 754]。这些包括特殊的 “非数字”(NaN)值,正负无穷大,和正负零。参看标准[JLS]的4.2.3 节关键规则的概要。 数字操作符将操作数转换成数字,仿佛调用了函数 操作符 操作符 注意: 由於 XML 允许
注意: 这与 Java 和ECMAScript 中的 注意: 这与 IEEE 754 中返回取整 除的余操作不一样。 数字表达式
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 的歧义:
表达式的词法结构
4 核心函数库本节描述用来求值表达式的函数, XPath的实现必须总是在函数库中包括这些函数。 在函数库中的每一个函数都使用一个函数原型,该原型给定返回类型,函数的名称,以及参数的类型。如果参数类型后跟随一个问号,那么参数是可选的;否则,参数则是必须有的。 4.1 节点集合函数number last()
number position()
number count(node-set)
node-set id(object)
string local-name(node-set?) 函数 string namespace-uri(node-set?) 函数 注意: 除了元素节点和属性节点外函数 string name(node-set?) 函数 注意: 除了元素节点和属性节点外,由 4.2 字符串函数string string(object?)
如果参数省略,则缺省为仅有一个上下文节点为成员的节点集合。 注意:
string concat(string, string, string*)
boolean starts-with(string, string) 如果第一个字符串参数以第二个字符串参数起头, boolean contains(string, string) 如果第一个字符串参数包含第二个字符串参数, string substring-before(string, string)
string substring-after(string, string)
string substring( string , number , number? )
更确切地说,每一个字符串里的字符(参看3.6 字符串)是被看作有一个数字位置:第一个字符是 1 ,第二个字符是 2 ,依此类推。 注意: 这与 Java 和 ECMAScript 不同,在 Java 和 ECMAScript 中
该返回的子字符串包含那些字符位置大於或等於第二参数的取整值,如果指定了第三个参数,则小於第二和第三个参数的取整值之和;以上的比较和加法遵循
IEEE 754 的规则;取整操作仿佛是调用了
number string-length( string? )
string normalize-space(string?)
string translate(string, string, string)
注意:
4.3 布尔函数boolean boolean(object)
boolean not(boolean) 如果参数为真 boolean true()
boolean false() The boolean lang(string) 依赖于
4.4 数字函数number number(object?)
如果参数省略,则缺省为仅有一个上下文节点为成员的节点集合。 注意: 除非元素是在语言自然格式(典型地被改变成语言特定的格式呈现给用户)下代表数字数据的类型, number sum(node-set) 对於在参数节点集合的每个节点, number floor(number)
number ceiling(number)
number round(number)
注意: 对於最后两种情况,调用 5 数据模型XPath 将一个 XML 文档作为一棵树进行操作。本节描述 XPath 怎样将一个 XML 文档建成一棵树的模型。该模型仅仅是概念上的并且不要求任何特定实现。在B XML 信息集映射中描述了该模型与 XML 信息集[XML Infoset] 被 XPath 操作的 XML 文档必须遵循XML 命名空间建议书[XML Names]。 树包含节点,共有7种节点类型:
[定义:对於每种节点类型,都有一个方法来决定该类型的节点的字串值。对一些节点,字串值是节点的一部分;对於其它节点,字串值的计算是由子孙节点的字串值来求出。] 注意: 对於元素节点和根节点,节点的字串值不与 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中的注释,扩展名的局部部分对应于
元素节点的孩子是元素节点,注释节点,处理节点及其内容的文字节点。对内部及外部实体的实体引用将被扩展,字符引用也被解决。 元素节点的字串值是元素节点在文本顺序下所有文字节点子孙的字串值的累加。 5.2.1 唯一 ID元素节点可以有 一个唯一标识符(ID),它是在DTD中声明为类型 注意: 如果一个文档没有DTD,那么,在该文档中没有元素将有唯一标识符。 5.3 属性节点每一个元素节点都有相关联的属性节点集;元素是每一个这些属性节点的父节点;然而,属性节点不是它父元素的孩子。 注意: 这与 DOM 不同,DOM 不认为元素拥有属性当做属性的父 (参看[DOM])。 元素从来不分享属性节点:如果一节点与另一节点不是同样的节点,那么,没有一个元素节点的属性节点会是另一节点的属性节点。 注意: 操作符 对待缺省属性与指定的属性一样。如果属性申明在DTD中元素类型,而缺省申明为
一些属性,如 属性节点有扩展名和字串值。扩展名的确定是根据 XML 命名空间建议书[XML Names],通过扩展 XML 文档标签中指定的QName而得到的。如果属性的QName没有前缀,属性的名的命名空间 URI 将为空。 注意: 依照[XML Names]附录A.3中的注释,扩展名 expanded-name
的局部部分对应于 属性节点有字串值。字串值是在 XML 建议书[XML]详细说明的规范化的值。对其规范化值是零长度字符串的属性无须分别处理:它以字串值是零长度字符串的属性节点为结果。 注意: 也可能在外部的DTD或外部的参数实体中声明缺省属性。除非正在进行校验,XML 建议书不要求 XML 处理器读外部的DTD或外部的参数。样式表或其它假设 XPath 树包含有在外部的DTD或外部的参数中申明缺省属性值的功能软件不能与一些无校验 XML 处理器一起工作。 没有属性节点与声明命名空间的属性相对应(参看[XML Names])。 5.4 命名空间节点每个元素都有命名空间节点的关联的集合,一个为在元素的范围的每个不同命名空间前缀(包括
命名空间节点有扩展名:其局域部分是命名空间前缀(如果命名空间节点为缺省命名空间,则为空);命名空间 URI 总为空。 命名空间节点的字串值是被绑定在命名空间前缀的命名空间 URI;如果它是相对的,它必须被解析,就象在扩展名中的命名空间 URI 扩展名字。 5.5 处理指令节点除了在文档类型声明中出现的所有处理指令外,每个处理指令都有处理指令节点。 每条处理指令都有扩展名:
其局域部分是处理指令的目标;其命名空间 URI 为空。处理指令节点的字串值是处理指令后跟随的目标及任何空白的部分,不包括结尾的
注意: XML 声明不是一条处理指令,因此,没有处理指令节点与 XML 声明相对应。 5.7 正文节点字符数据组成正文节点。尽可能多的字符数据被组织进正文节点:从来没有一个正文节点的后面或前面紧连的兄弟是个正文节点。正文节点的字串值是它的字符数据。正文节点总是至少有一个字符的数据。 在 CDATA 节内的每个字符都被当作字符数据,这样,在源文档的 注意: 当正文节点包含 注释、处理指令和属性值中的字符不产生正文节点。外部实体中的行结束符都按 XML 建议书[XML]规范化成 #xA 。 正文节点没有扩展名。 A 参考书目A.1 标准规范参考书目
A.2 其他参考书目
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 (只有成员可访问).
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||