XPath提纲XPath概述XPath基础XML文档的树型结构位置路径与基本位置步位置路径的构成XPath进阶谓词完整形式的路径通用XPath表达式XPath函数结束XPath概述XPath不是XML语言,引进XPath的目的是希望能提供标识XML文档某个特定部分的能力。XPath表达式用于根据位置、相对位置、类型或内容等信息确定结点(或结点集)XPath使用路径表达式来选取XML文档中的节点或者节点集XPath已被用在很多方面XSLT用XPath表达式来匹配和选择输入XML文档的特定部分以便执行相应操作并生成输出文档XPointer用XPath表达式来定位外部XML文档的某个特定部分W3CXMLSchema用XPath表达式来定义唯一性限制返回XML文档的树型结构(1)一个XML文档以看成由结点(nodes)构成的树。XPath是在文档树中选择结点或结点集的语言。XPath区分了如下类型的结点根结点(rootnode)元素结点(elementnodes)文本结点(textnodes)属性结点(attributenodes)注释结点(commentnodes)处理指令结点(processing-instructionnodes)命名空间结点(namespacenodes)如下XML文档:节点例子:?xmlversion=1.0encoding=ISO-8859-1?bookstorebooktitlelang=enHarryPotter/titleauthorJK.Rowling/authoryear2005/yearprice29.99/price/book/bookstorebookstore(文档节点)authorJK.Rowling/author(元素节点)lang=en(属性节点)位置路径与基本位置步(1)XPath表达式中最有用的是位置路径(locationpaths)。一条位置路径表示文档中的一组结点。上述所谓一组结点,可以不包含任何结点、包含一个结点或包含多个结点。一条位置路径由连续的若干个位置步(locationsteps)构成每个位置步将根据文档中被称为上下文结点(contextnodes)的特殊结点进行评价位置路径与基本位置步(2)返回位置步描述/文档的根结点元素名上下文结点的所有具有给定元素名的子元素@属性名上下文结点的所有具有给定属性名的属性comment()上下文结点的所有注释子结点text()上下文结点的所有文本子结点processing-instruction()上下文结点的所有处理指令子结点processing-instruction(目标)上下文结点的所有具有指定目标的处理指令子结点*上下文结点的所有子元素,可以带前缀node()上下文结点的所有子结点@*上下文结点的所有属性,*前可以带前缀位置路径1|位置路径2|…多值匹配位置路径的构成位置步之间利用反斜杠(/)串接成位置路径。位置路径中的每一步都相对其前一步如果位置路径以反斜杠打头,则该路径的第一步将相对与根结点;否则该路径的第一步将相对上下文结点。示例返回位置步描述//上下文结点的所有后代结点,包括上下文结点本身..上下文结点的父结点.上下文结点本身谓词位置路径中的每一步都可以带一个谓词以从当前步所对应的结点集中选择一部分子集。谓词包含Boolean表达式,该Boolean表达式将用于对上下文结点表中的各结点进行测试,如果表达式值为假,则相应结点将被从列表格中删除,否则保留。让某一个步骤带谓词的方式是:在该步骤之后添加由一对方括号包围的Boolean表达式。基本Boolean表达式中可以包含关系运算符(、=、、=、=、!=)或逻辑运算符(and和or)谓词也可以不是Boolean类型,数值型的谓词用于是匹配上下文结点的位置(从1开始计数)示例返回完整形式的路径(1)XPath规定:位置路径中的每个位置步都由三部分构成轴线(axis):必须的部分,指明从上下文结点出发在什么方向上寻找匹配的下一个结点。结点测试(nodetest):必须的部分,标识出在指定方向上匹配的结点(结点集)。谓词(predicate):可选部分,提供额外的表达式以进一步缩减匹配的结点数。完整形式的路径的一般形式为:轴线::结点测试[谓词]之前所给出的位置路径都是简写形式,简写形式的位置步里,轴线和结点测试两部分是合并的。示例:下面两个位置路径是等价的people/person/@idchild::people/child::person/attribute::id完整形式的路径(2)完整形式的路径很累赘,在实际应用中不常用完整形式的路径提供了比简写形式更强的功能完整形式的路径中可以指定的轴线有返回轴线含义轴线含义ancestor上下文结点的祖先ancestor-or-self上下文结点的祖先及其本身attribute@child上下文结点的儿子descendant上下文结点的子孙descendant-or-self//following上下文结点的后继following-sibling上下文结点的弟弟namespace上下文结点里的命名空间子结点parent..preceding上下文结点的前趋preceding-sibling上下文结点的兄长self.通用XPath表达式位置路径是XPath表达式(XPathexpressions)的一种,其值是一个结点集XPath表达式可以是数值、布尔型值或字符串数值:内部都使用8个字节的双精度浮点形式,可以用+、-、*、div和mod进行四则运算。布尔型:值是二值的,典型的例子是谓词。XPath中没有内置的布尔型常量字符串:用一对单引号或一对双引号括起的Unicode字符序列。可以用=或!=进行比较。返回XPath函数(1):概述XPath提供了十分丰富的函数XPath的函数返回值有四种类型布尔型数值型结点集字符串XPath不强调类型,因此往往调用函数时参数的类型并不重要有的XPath函数是可变参数的。XPath的函数以括号标识XPath函数(1):结点集函数position():返回当前结点在上下文结点表中的位置count():返回上下文结点表包含的结点数name():接收一个结点集,返回其第一个结点的名字;如果参数省则考查上下文结点。local-name():接收一个结点集,返回其第一个结点的名字之本地部分(不含命名空间);如果参数省则考查上下文结点。namespace-uri():接收一个结点集,返回其第一个结点的命名空间;如果参数省则考查上下文结点。XPath函数(2):字符串函数string():将参数转换为字符串参数为布尔型:转换为true或false参数为数值型:与其他编程语言类似参数为结点集:结点集中第一个结点的文本内容starts-with()contains()substring-before()substring-after()substring()string-length()normalize-space()translate()concat():参数个数可变XPath函数(3):布尔函数boolean():将参数转换为布尔型参数是数值:如果值为零或NaN则转换为假,否则转换为真参数是字符串:如果字符串长度为0则转换为假,否则转换为真参数是结点集:如果结点集为空(不包含任何结点)则转换为假否则转换为真true()false()not()XPath函数(4):数值函数返回number():将参数转换为数值参数是布尔型:为真则转换为1,否则转换为0参数是字符串:为数值串则转换为相应数值,否则转换为NaN参数是结点:先转换为字符串再转换为数值参数省略:转换上下文结点round()floor()ceiling()sum():接收一个结点集参数,将结点集里的各结点转换为数值型并求和。练习:指出以下路径表达式表示的结果1.//book/@category2./bookstore//@lang3./bookstore/book4./bookstore/book[@category='WEB']5.//title[@*]6.//book/title|//book/price7.//title/@lang8.//price[.30]9.//book[price30]“10.//book[year2005andyear=2003]“11./bookstore/book[0]12./bookstore/book13./bookstore/book/price/text()14./bookstore/book[price35]/title15./bookstore/book[position()3]返回