1、Xpath简明归纳Xpath 简明归纳定义:XPath 是一种用于对 XML 文档的元件寻址的一语言,设计为 XSLT 和 XPointer 使用。XPath是努力给XSL转换xslt和XPointerXPonter的共享功能提供一个共同的句法及语意的结果。目的:用于对XMLXML文档元件寻找地址。同时,有为字符串,数字和布尔的操作提供了基本的手段。XPath 也被设计成以便它有能被用于匹配的一个自然的子集(测试一个节点是否匹配一个模式)。XPath路径表达式XPath使用路径表达式来选取XML文档中的节点或者节点集。这些路径表达式和我们在常规的电脑文件系统中看到的表达式非常相似。可以看下面的
2、表格 选取节点: 表达式描述nodename选取此节点的所有子节点/从根节点选取/从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置.选取当前节点.选取当前节点的父节点选取属性实例在下面的表格中,我们已列出了一些路径表达式以及表达式的结果: 路径表达式结果bookstore选取 bookstore 元素的所有子节点/bookstore选取根元素 bookstore (注释:假如路径起始于正斜杠( / ),则此路径始终代表到某元素的绝对路径!)bookstore/book选取所有属于 bookstore 的子元素的 book 元素。/book选取所有 book 子元素,而不管它们在文档中的
3、位置。bookstore/book选择所有属于 bookstore 元素的后代的 book 元素,而不管它们位于 bookstore 之下的什么位置。/lang选取所有名为 lang 的属性。谓语(Predicates)谓语用来查找某个特定的节点或者包含某个指定的值的节点。谓语被嵌在方括号中。实例在下面的表格中,我们列出了带有谓语的一些路径表达式,以及表达式的结果: 路径表达式结果/bookstore/book1选取属于 bookstore 子元素的第一个 book 元素。/bookstore/booklast()选取属于 bookstore 子元素的最后一个 book 元素。/booksto
4、re/booklast()-1选取属于 bookstore 子元素的倒数第二个 book 元素。/bookstore/bookposition()35.00选取所有 bookstore 元素的 book 元素,且其中的 price 元素的值须大于 35.00。/bookstore/bookprice35.00/title选取所有 bookstore 元素中的 book 元素的 title 元素,且其中的 price 元素的值须大于 35.00。选取未知节点XPath 通配符可用来选取未知的 XML 元素。 通配符描述*匹配任何元素节点*匹配任何属性节点node()匹配任何类型的节点实例在下面的
5、表格中,我们列出了一些路径表达式,以及这些表达式的结果: 路径表达式结果/bookstore/*选取 bookstore 元素的所有子节点/*选取文档中的所有元素/title*选取所有带有属性的 title 元素。选取若干路径通过在路径表达式中使用“|”运算符,您可以选取若干个路径。实例在下面的表格中,我们列出了一些路径表达式,以及这些表达式的结果: 路径表达式结果/book/title | /book/price选取所有 book 元素的 tilte 和 price 元素。/title | /price选取所有文档中的 title 和 price 元素。/bookstore/book/tit
6、le | /price选取所有属于 bookstore 元素的 book 元素的 title 元素,以及文档中所有的 price 元素。什么是XPath?XPath使用路径表达式在XML文档中进行导航 XPath包含一个标准函数库 XPath是XSLT中的主要元素 XPath是一个W3C标准XPath标准函数XPath含有超过100个内建的函数。这些函数用于字符串值、数值、日期和时间表、节点和QName处理、序列处理、逻辑值等等。XPath的节点XPath 将一个 XML 文档建模成为一棵节点树,有不同类型的节点,包括元素节点,属性节点和正文节点。在XPath中,有七种类型的节点:元素、属性、
7、文本、命名空间、处理指令、注释以及文档节点(或成为根节点)。XPath 术语节点(Node)在XPath中,有七种类型的节点:元素、属性、文本、命名空间、处理指令、注释以及文档(根)节点。XML文档是被作为节点树来对待的。树的根被称为文档节点或者根节点。请看下面这个XML文档: Harry Potter J K. Rowling 2005 29.99上面的XML文档中的节点例子:(文档节点)J K. Rowling(元素节点)lang=en(属性节点)基本值(或称原子值,Atomic value)基本值是无父或无子的节点。基本值的例子:J K. Rowlingen项目(Item)项目是基本值或
8、者节点。节点的关系父(Parent)每个元素以及属性都有一个父。在下面的例子中,book元素是title、author、year以及price元素的父: Harry Potter J K. Rowling 2005 29.99子(Children)节点元素可有零个、一个或多个子。在下面的例子中,title、author、year以及price元素都是book元素的子: Harry Potter J K. Rowling 2005 29.99同胞(Sibling)拥有相同的父的节点在下面的例子中,title、author、year以及price元素都是同胞: Harry Potter J K.
9、Rowling 2005 29.99先辈(Ancestor)某节点的父、父的父,等等。在下面的例子中,title元素的先辈是book元素和bookstore元素: Harry PotterJ K. Rowling 2005 29.99后代(Descendant)某个节点的子,子的子,等等。在下面的例子中,bookstore的后代是book、title、author、year以及price元素: Harry Potter J K. Rowling 2005 29.99XPath的主要语法构件是以一个表达式的形式显示的,一个表达式匹配产生式 Expr,一个表达式被求值评估产出一个对象,该对象有下列
10、 4 种基本的类型之一:1. 节点集合(无序的、无重复的节点集合) 2. 布尔(真或假) 3. 数字(一个浮点数字) 4. 字符串(UCS 字符的顺序)表达式求值发生与上下文有关。XSLT 和 XPointer 分别地指定了上下文怎样在 XSLT 和 XPointer 使用 XPath 表达式。上下文组成包括:1. 一个节点(定义:上下文节点) 2. 一对非零正整数(定义:上下文位置和定义:上下文大小) 3. 一个变量绑定的集合 4. 一个函数库 5. 表达式范围内的命名空间声明的集合 上下文位置总是小於或等於上下文的大小。绑定由变量名变量值的映射组成,一个变量的值是一个对象,它的类型可以是任
11、何表达式的值所可能拥有的类型,并且也可以有这里没指定的另外的类型。他的类型是不确定的。可以是多样性的。函数库由函数名函数的映射组成,每个函数可以接受0个或0个以上的参数,并且返回单个的结果。这个文里面约定XPath实现必须支持一个核心函数库(在函数库中的每一个函数都使用一个函数原型,该原型给定返回类型,函数的名称,以及参数的类型。如果参数类型后跟随一个问号,那么参数是可选的;否则,参数则是必须有的)。核心函数库中的参数和结果同样有4中基本类型。当然了,XPath中的函数不是只有固定的,一般情况下我们可以采取XSLT 和 XPointer 通过定义另外的函数来扩展 XPath 的函数;这些函数的
12、类型中有些对 4 种基本的类型操作,其它的则对 XSLT 和 XPointer 定义的另外的数据类型操作。空间声明的规则由前缀命名空间URI的映射组成。变量绑定、函数库及命名空间声明对於求表达式或其子表达式的值总是一样的;上下文节点、上下文位置及大小对於求表达式或其子表达式的值则是不同的。有多种表达式可改变上下文节点,而只有判定词能改变上下文位置和上下文大小。在描述一种表达式的求值时,必须总是明确地说明是上下文节点、上下文位置、还是上下文的大小对子表达式的求值产生变化,如果没有关于上下文节点、上下文位置、上下文的大小的说明,那么对那种表达式的子表达式的求值就保持不变。XPath 表达式经常出现
13、的位置在 XML 属性里一种重要的表达式类型是地点路径,地址路径选择与上下文节点相关的节点集合。对是地址路径的表达式求值的结果是节点集合,该节点集合包含地点路径选择的节点。地址路径能递归地包含表达式,这些表达式用来过滤节点集合。地址路径与此同时LocationPath 相匹配。分析方法首先将字符和字符串分解成分割段(token),然后再分析所得到的分割段结果的序列。注意:空白符可以自由的在分割段之间被使用。分段化(tokenization)具体介绍见后面的分段化地址路径地址路径有两种:相对的地址路径和绝对的地址路径。未经缩写的句法的地址路径的一些例子:child:para 选择上下文节点的 p
14、ara 元素孩子child:* 选择上下文节点的所有元素孩子child:text() 选择上下文节点的所有的正文节点child:node() 选择上下文节点的所有的孩子,而不论它们是什么节点类型attribute:name 选择上下文节点的 name 属性attribute:* 选择上下文节点的所有的属性descendant:para 选择上下文节点的 para 元素子孙ancestor:div 选择上下文节点的 div 祖先ancestor-or-self:div 选择上下文节点的 div 祖先,并且,如果上下文节点为 div 元素,则该上下文节点也被选择descendant-or-self
15、:para 选择上下文节点中所有的 div 元素子孙,而且,如果上下文节点是一个 div 元素,则该上下文节点也被选择self:para 如果上下文节点是一个 para 元素,选择该上下文节点,否则不选择任何东西child:chapter/descendant:para 选择上下文节点的 chapter 元素孩子的所有的 para 元素子孙child:*/child:para 选择上下文节点的所有的 para 孙子/ 选择文档根(它总是是文档元素的父)/descendant:para 选择在同一文档中所有的 para 元素作为上下文节点 /descendant:olist/child:item
16、 选择在同一文档中所有的以 olist 为父的 item 元素作为上下文节点child:paraposition()=1 选择上下文节点的第一个 para 孩子child:paraposition()=last() 选择上下文节点的最后一个 para 孩子child:paraposition()=last()-1 选择上下文节点的倒数第二个 para 孩子child:paraposition()1 选择上下文节点中除第一个以外所有的 para 孩子following-sibling:chapterposition()=1 选择上下文节点的下一个 chapter 兄弟preceding-sibl
17、ing:chapterposition()=1 选择上下文节点的前一个 chapter 兄弟/descendant:figureposition()=42 选择文档中第四十二个 figure 元素/child:doc/child:chapterposition()=5/child:sectionposition()=2 选择文档元素 doc 的第五个 chapter 的第二个 sectionchild:paraattribute:type=warning 选择的上下文节点中有属性 type 且值为 warning 的 para 孩子child:paraattribute:type=warnin
18、gposition()=5 选择的上下文节点中所有的有属性 type 且值为 warning 的 para 孩子中第五个孩子child:paraposition()=5attribute:type=warning 选择的上下文节点中第五个 para 孩子,如果该孩子有 type 属性且值为 warning 的话child:chapterchild:title=Introduction 选择的上下文节点的 chapter 孩子,这些孩子有一个或一个以上字串值等於 Introduction 的 title 孩子child:chapterchild:title 选择的上下文节点中有一个或一个以上 t
19、itle 孩子的 chapter 孩子child:*self:chapter or self:appendix 选择上下文节点的 chapter 和 appendix 孩子child:*self:chapter or self:appendixposition()=last() 选择上下文节点的最后一个 chapter 或 appendix 孩子轴以下是可用到的轴:l child 轴包含上下文节点的孩子l descendant 轴包含上下文节点的子孙;子孙是一个孩子或一个孩子的一个孩子,等等,这样,子孙轴从来不包含属性或命名空间节点l parent 轴包含上下文节点的父,如果有的话l ance
20、stor 轴包含上下文节点的祖先;上下文节点的祖先由上下文节点的父以及父的父等等组成;这样,祖先轴将总是包括根节点,除非上下文节点是根节点l following-sibling 轴包含上下文节点的所有在其后的兄弟,如果上下文节点是属性节点或命名空间节点,following-sibling 轴则为空l preceding-sibling 轴包含上下文节点的所有在其前的兄弟,如果上下文节点是属性节点或命名空间节点,preceding-sibling 轴则为空l following 轴包含在上下文节点所在的同一文档中,所有依照文档顺序在上下文节点后的节点,但排除所有的子孙,也排除属性节点以及命名空间
21、节点l preceding 轴包含在上下文节点所在的同一文档中,所有依照文档顺序在上下文节点前的节点,但排除所有的子孙,也排除属性节点以及命名空间节点l attribute 轴包含上下文节点的属性,除非上下文节点是元素,该轴将为空l namespace 轴包含上下文节点的命名空间节点,除非上下文节点是元素,该轴将为空l self 轴只是包含上下文节点自己l descendant-or-self 轴包含上下文节点和上下文节点的子孙l ancestor-or-self 轴包含上下文节点和上下文节点的祖先;这样,该轴将总是包括根节点注意:ancestor,descendant,following,p
22、receding 以及 self 轴划分了一个文档(忽略属性和命名空间节点):他们相互不重叠,而且他们组在一起则包含了文档所有的节点。轴可定义某个相对于当前节点的节点集。 轴名称结果ancestor选取当前节点的所有先辈(父、祖父等)ancestor-or-self选取当前节点的所有先辈(父、祖父等)以及当前节点本身attribute选取当前节点的所有属性child选取当前节点的所有子元素。descendant选取当前节点的所有后代元素(子、孙等)。descendant-or-self选取当前节点的所有后代元素(子、孙等)以及当前节点本身。following选取文档中当前节点的结束标签之后的所
23、有节点。namespace选取当前节点的所有命名空间节点parent选取当前节点的父节点。preceding选取文档中当前节点的开始标签之前的所有节点。preceding-sibling选取当前节点之前的所有同级节点。self选取当前节点。步(step)包括:轴(axis) 定义所选节点与当前节点之间的树关系 节点测试(node-test) 识别某个轴内部的节点 零个或者更多谓语(predicate) 更深入地提炼所选的节点集 步的语法:轴名称:节点测试谓语 实例 例子结果child:book选取所有属于当前节点的子元素的 book 节点attribute:lang选取当前节点的 lang 属性child:*选取当前节点的所有子元素attribute:*选取当前节点的所有属性child:text()选取当前节点的所有文本子节点child:node()选取当前节点的所有子节点descendant:book选取当前节点的所有 book 后代ancestor:book选择当前节点的所有 book 先辈ancestor-or-self:book选取当前节点的所有book先辈以及当前节点(假如此节点是book节点的话)child:*/child:price选取当前节点的所有 price 子孙。参考资料:
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1