XPath简介 (作者:曾巧)

XPath简介  

http://numenzq.javaeye.com/blog/153913

作者:曾巧(numenzq

 

摘要

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

 

正文

在众多查询语言之中,结构化查询语言(SQL)是一种针对查询特定类型的关系库而设计和优化的语言。其他不那么常见的查询语言还有对象查询语言(OQL)和 XQuery。但本文的主题是 XPath,一种为查询 XML 文档而设计的查询语言。XPathW3C制定的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         JavaXPath的支持

l         概要

 

XPath概述

XPath是努力给XSLT转换和XPointe的共享功能提供一个共用的句法及语义的结果。XPath的主要的目是用于对XML文档元件寻址。在支持这个主要目的的同时,它也为字符串,数字和布尔的操作提供了基本手段。XPath使用简明的、非 XML 句法以便於在URIsXML属性值以内使用XPathXPathXML文档的抽象的、逻辑的结构而非它的表面句法进行操作,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.0XSLT 2.0的工作揭示了大量的共同基础,即两种语言在其中均可以共享相同的数据模型和表达式语法的领域。这个最小公分母就变成了XPath 2.0

 

XPath节点

XPathXML文档看作是一个节点树。节点可以有不同的类型,比如元素节点或者属性节点。一些类型的节点名称由 XML 名称空间URI(允许空)和本地部分组成。

一种特殊的节点类型是根节点。一个XML文档只能有一个根节点,它是树的根,包含整个XML文档。注意,根节点包含根元素以及在根元素之前或之后出现的任何处理节点、声明节点或者注释节点。

元素节点代表XML文档中的每个元素。属性节点附属于元素节点,表示XML文档中的属性。但是,以xmlns:开始的属性在XPath中使用名称空间节点表示。其他类型的节点包括文本节点、处理指令节点和注释节点。

 

位置路径

位置路径XPath中最有用也是应用最广泛的特性。位置路径是XPath表达式的特化(参见 表达式)。位置路径标识了和上下文有关的一组XPath节点。XPath定义了两种语法:简化语法和非简化语法。

本教程中只讨论简化语法,因为这种语法应用最广,而且非简化语法也更复杂。如果希望了解非简化语法,请参阅XPath 1.0规范。

位置路径有相对绝对两种类型。

相对位置路径由使用 / 分隔的定位步序列组成。

绝对位置路径由 / 和后面可选的相对位置路径组成,其中 / 表示根节点。绝对位置路径基本上就是在根节点上下文中计算的相对位置路径。

简化语法有一些非常实用的特点:

@ 用于引用属性。

* 用于引用上下文结点的所有子元素。@* 用于引用上下文结点的所有属性。

[] 也可用于引用有序序列中的特定元素。

// 用于引用上下文节点的所有孩子。

. 用于引用上下文节点自身。

.. 用于引用上下文节点的父节点。

谓词在位置路径中用于筛选当前节点集。谓词包含一个boolean表达式(或者很容易转化成 boolean 值的表达式)。用这个布尔表达式测试当前节点集的每个成员,如果表达式成立则保留该成员否则丢弃。谓词放在一对方括号([])中。

谓词也可以使用关系运算符 ><>=<= !=。如您在表达式中所看到的那样,它们也可以使用布尔运算符。

 

表达式

布尔表达式的值只能是:真或者假。

XPath 定义了andor运算符。对于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.0Unicode)字符序列。

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        

posted @ 2009-06-24 10:15  zengxinle  阅读(457)  评论(0编辑  收藏  举报