XPath入门教程整理
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
XPath入门教程目录
关于本教程中使用了例子 (2)
概述 (2)
AuctionItemList.xsd (2)
AuctionItemList.xml (3)
AuctionItemSummary-Base.xsl (4)
XPath概述 (6)
XPath术语 (7)
什么是XPath 节点? (7)
离开了上下文? (9)
位置路径 (10)
位置路径定义 (10)
实用语法 (10)
实验:位置路径 (11)
表达式 (12)
布尔表达式 (12)
数字 (13)
字符串 (14)
实验:表达式 (14)
函数库 (15)
函数库 (15)
节点集函数 (15)
字符串函数 (16)
布尔函数 (16)
数字函数 (16)
XPath入门教程----宁家川整理
关于本教程中使用了例子
概述
在本教程中,您将通过编写拍卖站点应用程序的表示层来学习XPath。
您将在XSLT 样式表内部指定XPath 表达式,该样式表用于展示包含拍卖物品的XML 文档。
本教程使用的所有文件都在zip 文件中,包括:
∙XPath/AuctionItemList.xsd――定义拍卖物品数据格式的XML Schema 文档。
∙XPath/AuctionItemList.xml――包含一系列拍卖物品的XML 文件;它是用于例子的数据。
∙XPath/AuctionItemSummary-Base.xsl――一个XSLT 样式表,用于定义当Web 浏览器加载AuctionItemList.xml 时,它将显示什么;它包含数据的表示规则。
∙XPath/AuctionItemSummary-Section5.xsl――位置路径中的解决方案。
∙XPath/AuctionItemSummary-Section6.xsl――表达式中的解决方案。
∙XPath/AuctionItemSummary-Section7.xsl――函数库中的解决方案。
AuctionItemList.xsd
AuctionItemList.xsd 包含针对拍卖物品和拍卖物品列表数据的业务规则,使用XML Schema 语言进行描述:
拍卖物品列表只有一个根元素,称为list,是auctionItemList类型元素的列表。
auctionItemList由类型为auctionItem的一个或多个item元素组成。
auctionItem由 5 个元素(bidIncrement、类型为price的currentPrice、endOfAuction、description和sellerId)和一个类型为itemAttributes的属性组组成。
price是一个正十进制值,具有两位小数,必须把类型为customCurrency的currency 属性与它关联。
customCurrency必须是USD、GBP或EUR之一。
itemAttributes组必须包含一个字符串属性type,一个字符串属性id,以及一个布尔属性private,默认情况下,其值是false。
type属性必须是下面值之一:Unknown、Traditional、BidOnly、FixedPrice或IndividualOffer。
如果想学习有关XML Schema 的更多知识,请参阅,获取更多的developerWorks文章和教程。
AuctionItemList.xml
AuctionItemList.xml 与AuctionItemList.xsd 中定义的XML Schema 一致,包含了一系列的类型auctionItemList。
这个列表包含了7 项。
列表根元素的xsi:schemaLocation 属性指出,该XML 文档与AuctionItemList.xsd schema 一致。
处理了数据格式之后,表示怎么办呢?您如何指定使用哪个XSLT 样式表,在Web 浏览器中显示该XML 文档?这是在XML 文档的第二行定义的:
<?xml-stylesheet type="text/xsl"
href="/developerWorks/cn/education/xml/x-xpath/tutorial/AuctionItemSummary-B ase.xsl"?>
这里,我声明应该使用AuctionItemSummary-Base.xsl 样式表。
数据本身已经选择了,这样,就可以展示XPath 的使用,用于显示数据属性。
当没有XML 样式表文档链接到AuctionItemList.xml 时,Web 浏览器只显示XML 内容,并且看起来像下面这样:
AuctionItemList.xml
AuctionItemSummary-Base.xsl
AuctionItemSummary-Base.xsl 是一个XSLT 样式表,它定义了XSLT 处理器使用的一些规则,用于显示AuctionItemList XML 文档。
它使用XPath 表达式来查找XML 文档中的信息,并把它显示在HTML 表中。
我将把更多的细节放在XPath 概述中,XSLT 中
XPath 的使用。
这里,我简要描述了AuctionItemSummary-Base.xsl 的内容。
它定义了处理XML 文档时会激活的模板。
激活哪个模板取决于,该template元素的match属性中记录的XPath 表达式。
例如,下面代码段就是XPath 表达式,它们取自AuctionItemSummary-Base.xsl:
∙"/"
∙"list"
∙"item"
模板激活时显示的信息,是由它的value-of元素的select属性定义。
这些属性的值也是XPath 表达式。
例如:
∙"description"
∙"currentPrice"
∙"@type"
∙"@private"
在每节(位置路径、表达式和函数库),您将修改AuctionItemSummary-Base.xsl,以便用不同的方式显示信息。
至此,您应该在文本/XML 编辑器中看到文件。
现在可以在使用的Web 浏览器中打开AuctionItemList.xml,查看XSLT 处理器基于样式表生成的输出。
您应该看到类似于下面的一些内容:
基本拍卖物品表
XPath概述
XML 路径语言(XPath)是一组语法和语义,用于引用XML 文档的一些部分。
XPath 的目的是让其他规范使用,比如XSL Transformations (XSLT) 和XML Pointer Language (XPointer)。
要帮助您理解XPath 是什么,我将通过展示一些与AuctionItemList.xml 有关的例子开始。
XPath 表达式确定了XML 文档中的一组节点。
这组节点可以包含零或多个节点。
例如,如果应用到AuctionItemList.xml,XPath 表达式/list就确定了一个单独的节点――list根元素。
The XPath 表达式/list/item确定了所有item元素。
XPath 使用正斜杠(/)符号,这与Unix shell 相似。
这就是XPath 可以用在Uniformed Resource Identifiers (URI) (比如URL)中的原因。
这实际上是XPath 名称的来源:像在URL 中一样使用路径符号。
合法的XPath 表达式可以包含谓词(predicate)。
谓词包含布尔表达式,它们针对上下文节点集中的每个节点进行了测试。
如果为真,将把节点保存在确定的节点集中;否则,就丢弃节点。
在减少结果集中,谓词是有用的。
例如,下面XPath 表达式只确定第二项:
/list/item[currentPrice>1000.0]
XPath 表达式可以引用属性及XML 文档中的元素。
当引用属性时,使用@字符。
例如,下面的XPath 表达式确定了currentPrice元素,其currency 属性包含值EUR:
/list/item/currentPrice[@currency="EUR"]
XPath 也提供函数,这可能是非常有用的。
我将在函数库中,详细展示这些函数,但这里是一个体验。
下面的XPath 表达式确定了item 的description元素,其type属性是“IndividualOffer”(并具有值2MP digital camera):
/list/item[starts-with(@type,"Ind")]/description
在使用的XML 编译器中测试上面的XPath 表达式:打开AuctionItemList.xml,然后在XPath 计算程序中输入表达式,看选定了哪些节点。
OK,现在已经向您介绍了XPath!至今,您已经学习了XPath 是一种语言,用于确定XML 文档的部分。
您已经看到XPath 表达式看起来像什么,以及它如何引用XML 文档内部的元素和属性。
我也已经向您展示了,XPath 如何提供函数用于操纵数据。
但这只是一个快速的概述;在其余的节中,我将更加详细讨论所有这些点――以及XPath 的更多方面。
例如,我将分析XPath 名称空间和特殊字符(比如//和*),并向您展示,并非所有XPath 表达式具有上
面例子中展示的形式(称为简化位置路径)。
XPath术语
什么是XPath 节点?
XPath 把XML 文档看作是一个节点树。
节点可以有不同的类型,比如元素节点或者属性节点。
一些类型的节点名称由XML 名称空间URI(允许空)和本地部分组成。
比如,下图中XPath 把AuctionItemList.xml 表示成一棵节点树:
AuctionItemList.xml 的XPath 视图
一种特殊的节点类型是根节点。
一个XML 文档只能有一个根节点,它是树的根,包含整个XML 文档。
注意,根节点包含根元素以及在根元素之前或之后出现的任何处理节点、声明节点或者注释节点。
该例中,根节点的孩子有:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl"
href="/developerWorks/cn/education/xml/x-xpath/tutorial/AuctionItemSummary-B ase.xsl"?>
and
<list ...>
<item ...>
...
</item>
<item ...>
...
</item>
...
</list>
XML 声明(如<?xml version="1.0" encoding="UTF-8"?>)或文档类型定义(DTD)没有节点类型,因此在XPath 中不能引用这类实体。
元素节点代表XML 文档中的每个元素。
属性节点附属于元素节点,表示XML 文档中的属性。
但是,以xmlns:开始的属性在XPath 中使用名称空间节点表示。
其他类型的节点包括文本节点、处理指令节点和注释节点。
离开了上下文?
XPath 相对于上下文计算表达式。
上下文通常用XPath 之外的其他技术如XSLT 和XPointer 指定。
XPath 上下文包括上下文节点以及上下文的大小、位置和其他相关数据。
从上下文的观点来看,其中最重要的是上下文节点。
如果上下文节点是根节点,那么list/item 指的就是AuctionItemList.xml 中的7 个item元素。
如果上下文节点是另一个节点,比方说第一个item元素,那么list/item在该XML 文档中什么也不指。
在XSLT 中,select属性的值是XPath 表达式。
比如在
AuctionItemSummary-Base.xsl 中,xsl:apply-templates和xsl:value-of元素的select属性值(XPath 表达式)包括list、item或itemId。
在XSLT 中,上下文节点是当前正在计算的节点。
对于一个XML 文档,XSLT 模板可能被激活多次并生成不同的结果。
在AuctionItemList.xml 中,第一个和第二个模板(match="/"和match ="list")被激活一次,而第三个模板(match="item")被激活七次(每个item元素激活一次)。
第一次激活“item”模板时,上下文节点是XML 文档中的第一个item元素("Miles Smiles album, CD"),比方说,<xsl:value-of select="@id"/>的值就是itemId0001。
这个XSLT 第二次被激活时,上下文节点就是第二个item元素("Coltrane Blue Train" CD),<xsl:value-of select="@id"/>的值是itemId0002。
注意,如果在select属性中使用/list/item/@id代替@id,xsl-value-of元素的值就会是空值。
位置路径
位置路径定义
位置路径是XPath 中最有用也是应用最广泛的特性。
位置路径是XPath 表达式的特化(参见表达式)。
位置路径标识了和上下文有关的一组XPath 节点。
XPath 定义了两种语法:简化语法和非简化语法。
本教程中只讨论简化语法,因为这种语法应用最广,而且非简化语法也更复杂。
如果希望了解非简化语法,请参阅XPath 1.0 规范(参见参考资料)。
位置路径有相对和绝对两种类型。
相对位置路径由使用/分隔的定位步序列组成。
比如:
list/item[currentPrice<20.0]
这个位置路径由两个定位步组成:首先list选择和上下文节点有关的一组节点,然后
item[currentPrice<20.0]在第一步所标识的子集中再选择一组节点;如果还有更多的节点也依此类推。
绝对位置路径由/和后面可选的相对位置路径组成,其中/表示根节点。
绝对位置路径基本上就是在根节点上下文中计算的相对位置路径,比如:
/list/item[currentPrice<20.0]
对于绝对位置路径(以/开始的位置路径),上下文节点是没有意义的,因为路径总是从根节点开始计算。
实用语法
简化语法有一些非常实用的特点(多数可以在XPath 概述中看到)。
现在列出最常用的一些特点,并给出相对于AuctionItemList.xml 根节点的例子,即以AuctionItemList.xml 的根节点作为上下文。
@ 用于引用属性。
比如,位置路径@currency标识了currency属性。
list/item[@private]标识带有private属性的item元素,意即AuctionItemList.xml 中的所有item元素。
* 用于引用上下文结点的所有子元素。
@* 用于引用上下文结点的所有属性。
[] 也可用于引用有序序列中的特定元素。
比如,list/item[2]代表第二个item元素。
实际上[] 是一个谓词(参见谓词)。
// 用于引用上下文节点的所有孩子。
比如,//item表示所有的item元素,而//list/item 引用以list为父元素的所有item元素(在该例中即所有的item元素)。
. 用于引用上下文节点自身。
比如,.选择上下文节点,而.//item代表作为上下文节点孩子的所有item元素。
.. 用于引用上下文节点的父节点。
比如,在第一个bidIncrement元素的上下文中,../item 就表示第一个item元素
谓词
谓词在位置路径中用于筛选当前节点集。
谓词包含一个boolean 表达式(或者很容易转化成boolean 值的表达式)。
用这个布尔表达式测试当前节点集的每个成员,如果表达式成立则保留该成员否则丢弃。
谓词放在一对方括号([])中。
比如下面的位置路径:
list/item/currentPrice[@currency="EUR"]
在计算过程中,AuctionItemList.xml 中所有的currentPrice元素都放在选择的节点集中。
然后计算谓词@currency="EUR",货币中不包含值EUR的currentPrice元素被抛弃。
谓词也可以使用关系运算符>、<、>=、<=和!=。
如您在表达式中所看到的那样,它们也可以使用布尔运算符。
实验:位置路径
现在,我已经介绍了什么是位置路径,您的任务是修改AuctionItemSummary-Base.xsl 已生成下面的结果,即表中只包含使用美元计价的物品:
包含用美元计价的拍卖物品的表
提示:需要用适当的位置路径代替list模板中select属性的值。
在用双引号(")包围的字符串中应使用单引号(')。
这一点将在表达式中进一步讨论。
一种解决方案是AuctionItemSummary-Section5.xsl。
修改AuctionItemList.xml 中的第二行,指向AuctionItemSummary-Section5.xsl,然后在Web 浏览器中打开AuctionItemList.xml。
位置路径是更一般的XPath 表达式的一个子集。
表达式不仅可以引用一组节点(位置路径),还可以返回布尔值、数字或者字符串。
表达式
布尔表达式
布尔表达式的值只能是:真或者假。
XPath 定义了and和or运算符。
对于and,首先计算左侧的操作数:如果不成立则返回false;否则计算右侧的操作数并决定表达式的结果。
对于or,如果左操作数计算结果为真则表达时返回true;否则计算右操作数并决定表达式的值。
比如,布尔表达式type="BidOnly"在AuctionItemList.xml 中第二个item元素的上下文中计算结果为true。
XPath 定义了以下运算符:
=表示“等于”
∙!=表示“不等于”
∙<表示“小于”
∙<=表示“小于等于”
∙>表示“大于”
∙>=表示“大于等于”
比如,在AuctionItemList.xml 中第一个item元素的上下文中,布尔表达式bidIncrement != 10返回true,而在第二个item元素的上下文中返回false。
=运算符用于节点时,测试两个节点的值是否相等,而不论是否是同一个节点。
该运算符可用于比较属性值。
比如,item[@type = @private]选择type属性值和private属性值相同的物品。
XML 文档中包含XPath 表达式时,必须遵循XML 1.0 的结构良好性规则,任何<或<=字符必须分别用<和<=表示。
比如,XPath 表达式bidIncrement < 5在XPointer 中是合法的,但是在XSLT 文档中必须写成bidIncrement < 5。
如果布尔表达式的操作数类型不同(节点集、数字、字符串),需要进行转换,详情参见XPath 1.0 规范。
数字
XPath 数字是64 位双精度浮点数。
XPath 数字包括“非数字” NaN值、正无穷和负无穷、正零和负零。
XPath 提供的数值运算符有:+(加)、-(减)、*(乘)、div(除)和mod(整除求余)。
如果需要数值运算法会把操作数转换成数字,就像使用number函数一样(参见函数库)。
提示:减法(-)运算符的前面必须有空格,因为XML 允许字符串中包含“-”字符。
下面是XPath 数字表达式的一些例子:
∙7 + 3 返回10
∙7 - 3 返回4
∙7 * 3 返回21
∙7 div 3 返回2.3333333333333335
∙7 mod 3 返回1
提示:星号(*)可以被解释成通配符或者乘法字符。
XPath 定义了词法规则以消除这种歧义(详请参阅XPath 1.0 规范)。
但是,除法字符引入了新的运算符div,因为,反斜杠(/)用于分隔定位步。
字符串
XPath 字符串是有效的XML 1.0(Unicode)字符序列,如Miles Smiles album, CD。
XPath 中的字符串使用引号('或")包围起来。
如果XML 文档中的XPath 字符串包含引号,可以选择:
∙分别使用'或"引起来。
比如,description = 'New 256m "USB" MP3 player'。
∙如果表达式用双引号(")包围起来,则在表达式中使用单引号('),反之亦然。
比如,'New 356m "USB" MP3 player'。
XPath 提供了非常有用的字符串处理函数,参见函数库。
实验:表达式
现在我们介绍了XPath 表达式,您的任务是修改AuctionItemSummary-Base.xsl 来得到下面的结果――表中包含这一小时中拍卖完成的所有物品:
一小时中拍卖完成的物品
提示:endOfAuction是到拍卖结束时还剩下的时间,精确到分钟。
需要像位置路径中那样改变同一个select属性。
一种解决方案是AuctionItemSummary-Section6.xsl。
修改AuctionItemList.xml 中的第二行,指向AuctionItemSummary-Section6.xsl,然后在Web 浏览器中打开AuctionItemList.xml。
函数库
函数库
XPath 定义了一组函数,称为核心函数库。
每个函数从三个方面来定义:
∙函数名
∙返回类型(必须的,不能使用void)
∙参数类型(可以没有参数或者带有多个参数,参数可以是必需的也可以是可选的)
您可能会发现在谓词和表达式中经常会使用函数。
其他规范如XSLT 扩展了这个函数集。
函数被分成四类,以下分别介绍:
∙节点集函数
∙字符串函数
∙布尔函数
∙数字函数
节点集函数
节点集函数提供关于一组节点(一个或多个节点)的信息。
常用的节点集函数有:
∙last()――返回一个称为上下文大小的数字,即给定上下文中的节点数,不同于最后一个节点。
∙position()――返回一个称为上下文位置的数字,集当前节点在给上下文节点集(列表)中的位置。
比如,可以用表达式position()=last()测试处理的是否是集合中的最后一个节点。
∙count(node-set)――返回实参节点集中的节点数。
比如,在AuctionItemList.xml 文档的上下文中,count(//item)返回item元素的个数,即7。
∙id(object)――返回一个节点集,根据在DTD 中声明为ID 类型的唯一标识符选择元素。
因为在AuctionItemList.xml 中没有使用DTD,这个例子中得到的节点集总是空集。
Id("ItemId0001")返回一个空节点集。
XPath 还定义了和节点名及名称空间有关的其他三个函数:
∙local-name()
∙namespace-uri()
∙name()
详情参见XPath 1.0 规范的4.1 节。
字符串函数
通过字符串函数您可以操纵字符串。
常用的字符串函数有:
∙string()――把参数对象或者上下文结点转化成字符串。
合法的参数包括节点集、数字、布尔值或者其他任何类型――但是对于最后一种情况转换的结果不可预料。
建议使
用XSLT 函数format-number把数字转化成字符串,或者使用XSLT 元素
xsl:number提供给用户。
∙concat()――以两个或更多字符串作为参数并返回这些字符串的连接。
比如,concat("Original ","recording ","Blue Train LP record")返回
"Original recording Blue Train LP record"。
∙starts-with()――如果第一个字符串参数以第二个字符串参数开始则返回true,否则返回false。
比如,starts-with("Miles Smiles album, CD", "Miles")返回true。
∙contains()――如果第一个字符串参数包含第二个字符串参数则返回true,否则返回false。
比如,contains("Miles Smiles album, CD", "album")返回true。
其他的XPath 字符串函数包括:substring()、substring-before()、
substring-after()、string-length()、normalize-space()和translate()。
详请参阅XPath 1.0 规范的 4.2 节。
布尔函数
布尔函数用于把一个对象或字符串转化成true 或者false,或者直接获得真或假的值。
布尔函数有:
∙boolean()――根据以下规则返回作为参数传递的对象转换成布尔值的结果:不同于
0 或者NaN的数字为true;非空的节点集或者字符串为true。
其他类型的对象已不
可预料的方式转换。
∙not()――如果作为参数传递的布尔值为false 返回true,否则返回false。
∙true()和false()――分别返回true 或false。
这些函数很有用,因为在XPath 中true 和false 被看作是普通的字符串而不是真和假的值。
∙lang()――如果上下文节点的语言和字符串参数中指定的语言相同,或者是它的一种子语言返回true,否则返回false。
上下文节点的语言通过xml:lang 属性的值定义。
比如,lang("en")对于AuctionItemList.xml 树中的任何节点都返回false,因为没有指定xml:lang属性。
数字函数
数字函数是XPath 的数值函数,都返回数字。
其中包括:
∙number()――把可选的对象参数(如果没有指定参数则使用上下文节点)转化成数字,转换的规则如下:
o布尔值true 转换成1,false 转换成0。
o字符串转换成合理的数字。
o节点集首先转换成字符串,然后把这个字符串转换成数字。
其他类型对象以不可预料的方式转换。
比如,number("250")返回250,而
number("miles1965")返回NaN。
∙sum()――对节点集参数中的所有节点应用number()函数后返回它们的和。
∙floor()――返回不大于数字参数的最大整数数字。
比如,floor(2.75)返回2。
∙ceiling()――返回不小于数字参数的最小整数数字。
比如,ceiling(2.75)返回3。
∙round()――返回和数字参数最接近的整数数字。
比如,round(2.75)返回3。
实验:函数库
现在已经介绍了函数库,您的任务是修改AuctionItemSummary-Base.xsl 以生成下面的结果――只包含新的拍卖物品的表:
只包含新的拍卖物品
提示:这类拍卖物品应该在描述中包含字符串New或NEW。
同样需要像位置路径和表达式中那样修改select属性。
一种解决方案是AuctionItemSummary-Section7.xsl。
修改AuctionItemList.xml 中的第二行,指向AuctionItemSummary-Section7.xsl,然后在Web 浏览器中打开AuctionItemList.xml。