XML 路径语言(XPath)(二)

来源:互联网 发布:ru域名注册 编辑:程序博客网 时间:2024/06/05 19:20

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 属性。.

原创粉丝点击