XPath作用
- XPath 是一门在 XML 文档中查找信息的语言。XPath 可用来在 XML 文档中对元素和属性进行遍历。
- XPath 是 W3C XSLT 标准的主要元素,并且 XQuery 和 XPointer 都构建于 XPath 表达之上。因此,对 XPath 的理解是很多高级 XML 应用的基础。
XPath概述
- XPath的内容包括三个部分:
XPath使用路径表达式在XML文档中进行导航。
XPath包含一个标准函数库。
XPath是XSLT中的主要元素。
XPath版本:
XPath1.0是1999年成为W3C标准
XPath2.0是2007年确立的 - XPath的节点
节点类型 | 说明 |
---|---|
根节点 | XML文档的根称为文档节点或根节点 |
元素节点 | 一个元素的开始标签、结束标签,以及开始标签和结束标签之间的全部内容整体称为元素节点 |
属性 | 元素的每个属性都是属性节点。属性节点包括属性名和属性值两个部分 |
文本 | 所有的字符数据,包括CDATA段的字符数据 |
命名空间 | 命名空间代表XML文档那个中的xmlns:prefix属性 |
处理指令 | XML文档的处理指令 |
注释 | <!-- 注释--> |
- 示例
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="xslDemo.xsl" ?>
<!-- 个人信息-->
<person id="210212201104110821" xmlns:demo="http://www.china.person/dalian">
<name>田诗琪</name>
<birthdate>2011-04-11</birthdate>
<sex>女</sex>
<high>83cm</high>
</person>
节点集对象
- 一个节点集是一组节点的无序组合,它是XPath表达式运算的直接结果。节点集能够包含来自任意七种不同类型的节点。
- 节点集中每一个节点都被认为是集合中其他节点的兄弟节点。如果节点集中的节点包含子节点,这些子节点并不是节点集的一部分。
- 根节点就是节点树的根,用“/”来表示。即文档中的所有节点(包括处理指令节点、根元素节点等)都是根节点的子孙节点。文档根元素节点是根节点的子节点。
- 根节点与文档根元素节点
是不同的,文档根元素节点是XML文档的第一个顶层元素对应的元素节点。
XPath 路径
XPath 使用路径表达式来选取 XML 文档中的节点或者节点集。
- XPath路径包括一个或多个Step组成,Step常被翻译为步或步骤。不同Step之间使用“/”分割。
- XPath中Step的语法如下所示:
轴::节点测试[限定谓语]
参数说明:
轴:用于定义当前节点与所选节点的关系
节点测试:用于指定轴内部的部分节点
限定谓语:零个或另个以上的判读语句,使用专用的表达式对轴和节点测试匹配的节点做进一步限定 - 示例
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:fn="http://www.w3.org/2005/xpath-functions">
<xsl:template match="/root">
<!--第一行结果中显示的为child::node()筛选出所有当前节点子节点集的内容-->
<xsl:value-of select="child::node()"/><p/>
<!--第二行结果中显示的为child::id筛选出的节点集中所有名字为id的节点集中的内容-->
<xsl:value-of select="child::id"/><p/>
<!--第三行结果中显示的为child::id[text()=100]筛选出的节点集中所有名字为id并且节点的文本内容为100的节点集中的内容-->
<xsl:value-of select="child::id[text()=100]"/><p/>
</xsl:template>
</xsl:stylesheet>
轴
- 在一个定位路径中轴是一种相互关系,是定位步长本身与上下文节点之间的关系。
XPath轴(XPath Axes)可定义某个相对于当前节点的节点集
在XPath中轴的类型或关系有:
节点关系
- 父轴(Parent)
每个元素以及属性都有一个父轴
<book>
<title>Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
book 元素是 title、author、year 以及 price 元素的父
- 子轴(Children)
拥有相同的父轴的节点
<book>
<title>Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
title、author、year 以及 price 元素都是 book 元素的子
- 同胞轴(Sibling)
元素节点可有零个、一个或多个子轴
<book>
<title>Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
title、author、year 以及 price 元素都是同胞
- 先辈轴(Ancestor)
某节点的父轴、父轴的父轴,等等
<bookstore>
<book>
<title>Harry Potter</title> <author>J K. Rowling</author> <year>2005</year> <price>29.99</price>
</book>
</bookstore>
title 元素的先辈是 book 元素和 bookstore 元素
- 后代轴(Descendant)
某个节点的子轴,子轴的子轴,等等
<bookstore>
<book>
<title>Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
</bookstore>
bookstore 的后代是 book、title、author、year 以及 price 元素
节点测试
XPath支持的节点测试语法,能够对轴索筛选出的结果集做进一步过滤。具体常用的语法包括:
nodename
从指定轴匹配的所有节点中选出名称为nodename的节点node()
选择与之匹配的所有类型的节点text()
选择制定轴匹配的所有文本类型的节点
4.comment()
选择指定轴匹配的所有注释节点processiong-instruction()
选择指定轴匹配的所有处理指令节点*
星号(*)是节点测试的通配符,不对指定轴进行任何过滤
谓词
- 谓词在步的语法中放在中括号中,一个步中可以包含零个或多个谓词。
- 谓词本身是一个布尔类型表达式
例如:child::id[text()=100]中包含了一个谓词,表达的含义是过滤出文本内容等于100的值 - xPath运算符:
XPath函数
XPath1.0中函数库包括共27个函数,根据函数传入的参数可以分为4类:
节点集函数库
布尔函数库
数字函数库
字符串函数库。
节点集函数库
具体包含的函数如下所示:
last()
: 返回当前选中节点集的最后一个节点的位置,是一个数字。
position()
:返回当前正在处理的节点处于选中的节点集的位置,是一个数字。
count(ns)
:返回当前选中的节点集的节点数量。
local-name(ns?)
:返回传入节点的本地部分。
namespace-uri(ns?)
:返回传入节点的命名空间部分URI部分。
name(ns?)
:返回传入节点的完整扩展名称,如果有命名空间则包括命名空间URI部分。
布尔函数库
具体包含的函数如下所示:
boolean(obj)
:用于测试参数“obj”是否存在。如果obj指定的是一个节点集,当且仅当指定节点集不为空时返回的结果才是真。如果是一个字符串,当且仅当字符串长度大于零时返回值才是真。如果是一个数字,当且仅当数字大于零才返回真。否则返回的结果为假。
not(boolean)
:对参数取反,即传入真时返回假,当传入假时函数返回值为真。
true()
:简单地返回true
false()
:简单地返回false
lang(str)
:返回值为布尔值,根据上下文节点是否有xml:lang属性,且它的值是否等于”str”指定的。如果有且相等,则返回true。’
数字函数库
具体包含的函数如下所示:
number(obj)
:将一个对象转换为数字
sum(ns?)
:把传入的节点集中每一个节点转换为数字并求和
floor(num)
:利用截断的原则取整的函数
ceiling(num)
:利用进一法的原则取整的函数
round(num)
:返回四舍五入的原则取整的函数
字符串函数库
具体包含的函数如下所示:
string(any)
:以XPath中的四种类型对象为参数,并将其转换为一个字符串。
concat(string,string,...)
:传入参数为字符串或模式表达式,返回由两个或更多字符串组成的字符串
substring(string,number,number?)
:返回指定位置的子串
contains()
:检查字符串中是否包含另外一个字符串
XPath路径
轴名称 | 简化路径 |
---|---|
child:: | 省略 |
attribute:: | @ |
self:: | . |
parent:: | .. |
descendant-or-self | // |
[position()=1] | [1] |
-
通过绝对路径寻址节点
斜线“/”代表根节点,绝对路径总是从根节点开始。
例如:
/book/preface -
通过上下文节点寻址
不以“/”开头,代表了目标节点与上下文节点的相对位置关系。 -
示例代码:
<?xml version="1.0" encoding="ISO-8859-1"?>
<bookstore>
<book>
<title lang="eng">Harry Potter</title> <price>29.99</price>
</book>
<book>
<title lang="eng">Learning XML</title> <price>39.95</price>
</book>
</bookstore>