番茄的梦想

那一抹夕阳

  博客园  :: 首页  ::  :: 联系 :: 订阅 订阅  :: 管理
作者:曾巧(numenzq)

摘要
XPath是XML文档内容寻址语言,由于XPath可应用于不止一个的标准,因此W3C将其独立出来作为XSLT(XSL Transformations)的配套标准颁布,它也是XPointer(XML Pointer Language)的重要组成部分。

正文
在众多查询语言之中,结构化查询语言(SQL)是一种针对查询特定类型的关系库而设计和优化的语言。其他不那么常见的查询语言还有对象查询语言(OQL)和 XQuery。但本文的主题是 XPath,一种为查询 XML 文档而设计的查询语言。XPath由W3C制定的XML文档寻址标准,最近W3C发布了XPath 2.0版本并更新了文档,作为XPath 1.0超集的XPath2.0版本,它更加强大,也更加健壮,因为它支持范围更广的数据类型。这是因为XPath 2.0有效利用了XML Schema类型,而不仅是简单的字符串、数字和布尔值。XPath 2.0保持向后兼容,因此除了规范中明确说明的之外,1.0表达式在2.0中可以正常使用。

内容
l          XPath概述
l          XPath 1.0限制
l          XPath节点
l          位置路径
l          表达式
l          函数库
l          Java对XPath的支持
l          概要

XPath概述
XPath是努力给XSLT转换和XPointe的共享功能提供一个共用的句法及语义的结果。XPath的主要的目是用于对XML文档元件寻址。在支持这个主要目的的同时,它也为字符串,数字和布尔的操作提供了基本手段。XPath使用简明的、非 XML 句法以便於在URIs和XML属性值以内使用XPath,XPath对XML文档的抽象的、逻辑的结构而非它的表面句法进行操作,XPath的名字源于它在URL中用作对XML文档的层次的结构进行导航一个路径标志。
除了用做寻址外,XPath也被设计成以便它有能被用于匹配的一个自然的子集(测试一个节点是否匹配一个模式);XSLT中描述了XPath在这方面的使用。
XPath将一个XML文档建模成为一棵节点树,有不同类型的节点,包括元素节点、属性节点和正文节点。XPath定义了一种方法来计算每类的节点的字串值。一些节点的类型也有名字。XPath充分支持XML命名空间(XML namespaces)。这样,节点的名字被建模成由一个局城部分和可能为空的命名空间URI组成的对;这被称为扩展名。

XPath 1.0 限制
尽管XPath 1.0简化了许多一般的编程任务,但是,开发人员开始想要得到更多好处。XPath 1.0规范在几个领域中受到了限制或混淆,需要进行一番整改。开发人员一直致力于改进W3C,并向该语言添加了一些更为有意义的功能,其中多数功能支持对W3C XML规范的其他引申(如XML架构、XML Query 1.0以及XSLT 2.0)。
自从XPath 1.0发布以来,XML架构就成为W3C推荐项之一,并讯速定位为其他数个进行中的工作的“官方”类型系统,例如XQuery和其他与Web服务有关的工作。因为XML架构是 XML 全局中不可或缺的组成部分,所以W3C强烈希望实现类型化XPath(能够选择类型 double 的所有元素不是非常好吗?)。而且,最近有关XQuery 1.0和XSLT 2.0的工作揭示了大量的共同基础,即两种语言在其中均可以共享相同的数据模型和表达式语法的领域。这个最小公分母就变成了XPath 2.0。

XPath节点
XPath把XML文档看作是一个节点树。节点可以有不同的类型,比如元素节点或者属性节点。一些类型的节点名称由 XML 名称空间URI(允许空)和本地部分组成。
一种特殊的节点类型是根节点。一个XML文档只能有一个根节点,它是树的根,包含整个XML文档。注意,根节点包含根元素以及在根元素之前或之后出现的任何处理节点、声明节点或者注释节点。
元素节点代表XML文档中的每个元素。属性节点附属于元素节点,表示XML文档中的属性。但是,以xmlns:开始的属性在XPath中使用名称空间节点表示。其他类型的节点包括文本节点、处理指令节点和注释节点。

位置路径
位置路径是XPath中最有用也是应用最广泛的特性。位置路径是XPath表达式的特化(参见 表达式)。位置路径标识了和上下文有关的一组XPath节点。XPath定义了两种语法:简化语法和非简化语法。
本教程中只讨论简化语法,因为这种语法应用最广,而且非简化语法也更复杂。如果希望了解非简化语法,请参阅XPath 1.0规范。
位置路径有相对和绝对两种类型。
相对位置路径由使用 / 分隔的定位步序列组成。
绝对位置路径由 / 和后面可选的相对位置路径组成,其中 / 表示根节点。绝对位置路径基本上就是在根节点上下文中计算的相对位置路径。
简化语法有一些非常实用的特点:
@ 用于引用属性。
* 用于引用上下文结点的所有子元素。@* 用于引用上下文结点的所有属性。
[] 也可用于引用有序序列中的特定元素。
// 用于引用上下文节点的所有孩子。
. 用于引用上下文节点自身。
.. 用于引用上下文节点的父节点。
谓词在位置路径中用于筛选当前节点集。谓词包含一个boolean表达式(或者很容易转化成 boolean 值的表达式)。用这个布尔表达式测试当前节点集的每个成员,如果表达式成立则保留该成员否则丢弃。谓词放在一对方括号([])中。
谓词也可以使用关系运算符 >、<、>=、<= 和 !=。如您在表达式中所看到的那样,它们也可以使用布尔运算符。

表达式
布尔表达式的值只能是:真或者假。
XPath 定义了and和or运算符。对于and,首先计算左侧的操作数:如果不成立则返回false;否则计算右侧的操作数并决定表达式的结果。对于or,如果左操作数计算结果为真则表达时返回true;否则计算右操作数并决定表达式的值。
XPath 定义了以下运算符:
l          = 表示“等于”
l          != 表示“不等于”
l          < 表示“小于”
l          <= 表示“小于等于”
l          > 表示“大于”
l          >= 表示“大于等于”
= 运算符用于节点时,测试两个节点的值是否相等,而不论是否是同一个节点。该运算符可用于比较属性值。
XML 文档中包含 XPath 表达式时,必须遵循 XML 1.0 的结构良好性规则,任何 < 或 <= 字符必须分别用 &lt; 和 &lt;= 表示。比如,XPath 表达式 bidIncrement < 5 在XPointer中是合法的,但是在XSLT文档中必须写成 bidIncrement &lt; 5。
如果布尔表达式的操作数类型不同(节点集、数字、字符串),需要进行转换,详情参见XPath 1.0规范。

XPath数字是64位双精度浮点数。XPath数字包括“非数字”NaN值、正无穷和负无穷、正零和负零。
XPath提供的数值运算符有:+(加)、-(减)、*(乘)、div(除)和mod(整除求余)。
如果需要数值运算法会把操作数转换成数字,就像使用number函数一样(参见 函数库)。
提示:减法(-)运算符的前面必须有空格,因为 XML 允许字符串中包含“-”字符。星号(*)可以被解释成通配符或者乘法字符。XPath 定义了词法规则以消除这种歧义(详请参阅 XPath 1.0 规范)。但是,除法字符引入了新的运算符 div,因为,反斜杠(/)用于分隔定位步。

XPath字符串是有效的XML 1.0(Unicode)字符序列。
XPath中的字符串使用引号(' 或 ")包围起来。如果XML文档中的XPath字符串包含引号,可以选择:
l          分别使用&apos;或&quot;引起来。
l          如果表达式用双引号(")包围起来,则在表达式中使用单引号('),反之亦然。
XPath提供了非常有用的字符串处理函数,参见 函数库。

函数库
XPath 定义了一组函数,称为核心函数库。每个函数从三个方面来定义:
l          函数名
l          返回类型(必须的,不能使用 void)
l          参数类型(可以没有参数或者带有多个参数,参数可以是必需的也可以是可选的)
您可能会发现在谓词和表达式中经常会使用函数。其他规范如XSLT扩展了这个函数集。函数被分成四类,以下分别介绍:
l          节点集函数
l          字符串函数
l          布尔函数
l          数字函数

节点集函数提供关于一组节点(一个或多个节点)的信息。常用的节点集函数有:
l          last()——返回一个称为上下文大小的数字,即给定上下文中的节点数,不同于最后一个节点。
l          position()——返回一个称为上下文位置的数字,集当前节点在给上下文节点集(列表)中的位置。比如,可以用表达式 position()=last() 测试处理的是否是集合中的最后一个节点。
l          count(node-set)——返回实参节点集中的节点数。
l          id(object)——返回一个节点集,根据在 DTD 中声明为 ID 类型的唯一标识符选择元素。
XPath 还定义了和节点名及名称空间有关的其他三个函数:
l          local-name()
l          namespace-uri()
l          name()

通过字符串函数您可以操纵字符串。常用的字符串函数有:
l          string()——把参数对象或者上下文结点转化成字符串。合法的参数包括节点集、数字、布尔值或者其他任何类型——但是对于最后一种情况转换的结果不可预料。建议使用 XSLT 函数 format-number 把数字转化成字符串,或者使用 XSLT 元素 xsl:number 提供给用户。
l          concat()——以两个或更多字符串作为参数并返回这些字符串的连接。
l          starts-with()——如果第一个字符串参数以第二个字符串参数开始则返回 true,否则返回 false。
l          contains()——如果第一个字符串参数包含第二个字符串参数则返回 true,否则返回 false。
其他的XPath 符串函数包括:substring()、substring-before()、substring-after()、string-length()、normalize-space()和translate()。详请参阅XPath 1.0规范的4.2节。

布尔函数用于把一个对象或字符串转化成 true 或者 false,或者直接获得真或假的值。布尔函数有:
l          boolean()——根据以下规则返回作为参数传递的对象转换成布尔值的结果:不同于 0 或者 NaN 的数字为 true;非空的节点集或者字符串为 true。其他类型的对象已不可预料的方式转换。
l          not()——如果作为参数传递的布尔值为 false 返回 true,否则返回 false。
l          true() 和 false()——分别返回 true 或 false。这些函数很有用,因为在 XPath 中 true 和 false 被看作是普通的字符串而不是真和假的值。
l          lang()——如果上下文节点的语言和字符串参数中指定的语言相同,或者是它的一种子语言返回 true,否则返回 false。上下文节点的语言通过 xml:lang 属性的值定义。比如,lang("en") 对于 AuctionItemList.xml 树中的任何节点都返回 false,因为没有指定 xml:lang 属性。

数字函数是 XPath 的数值函数,都返回数字。其中包括:
l          number()——把可选的对象参数(如果没有指定参数则使用上下文节点)转化成数字,转换的规则如下:
l          布尔值 true 转换成1,false 转换成 0。
l          字符串转换成合理的数字。
l          节点集首先转换成字符串,然后把这个字符串转换成数字。
l          其他类型对象以不可预料的方式转换。
l          sum()——对节点集参数中的所有节点应用 number() 函数后返回它们的和。
l          floor()——返回不大于数字参数的最大整数数字。
l          ceiling()——返回不小于数字参数的最小整数数字。
l          round()——返回和数字参数最接近的整数数字。

Java对XPath的支持
Java 5 推出了javax.xml.xpath包,提供一个引擎和对象模型独立的XPath库。这个包也可用于Java 1.3及以后的版本,但需要单独安装Java API for XML Processing(JAXP) 1.3。

概要
通过本教程,您了解了XPath是用于处理XML文档不同部分的一种语言。您看到了XPath 和其他XML技术的联系,如XSLT和XPointer。您了解了什么是XPath表达式,包括表达式的一种特例称为位置路径。您还简要地了解了一下XPath函数库和已经推出的XPath 2.0的新特性。

更多信息
·XML Path Language
http://www.w3.org/TR/xpath
·XML Path Language (XPath) 2.0
http://www.w3.org/TR/xpath20/
·XML 路径语言(XPath) (版本   1.0)     
http://www.opendl.com/openxml/w3/TR/xpath/xpath-gb.html#location-paths

posted on 2007-09-24 10:06  番茄的梦想  阅读(1518)  评论(0编辑  收藏  举报