`
躁动的绵羊
  • 浏览: 94432 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

XML教程——XPath

阅读更多

用XPath精确定位节点元素

在利用XSL进行转换的过程中,匹配的概念非常重要。在模板声明语句 xsl:template match = ""和模板应用语句xsl:apply-templates select = "" 中,用引号括起来的部分必须能够精确地定位节点。具体的定位方法则在XPath中给出。

之所以要在XSL中引入XPath的概念,目的就是为了在匹配XML文档结构树时能够准确地找到某一个节点元素。可以把XPath比作文件管理路径:通过文件管理路径,可以按照一定的规则查找到所需要的文件;同样,依据XPath所制定的规则,也可以很方便地找到XML结构文档树中的任何一个节点,显然这对XSLT来说是一个最最基本的功能。


XPath数据类型

XPath可分为四种数据类型:

  • 节点集(node-set)
    节点集是通过路径匹配返回的符合条件的一组节点的集合。其它类型的数据不能转换为节点集。
  • 布尔值(boolean)
    由函数或布尔表达式返回的条件匹配值,与一般语言中的布尔值相同,有true和 false两个值。布尔值可以和数值类型、字符串类型相互转换。
  • 字符串(string)
    字符串即包含一系列字符的集合,XPath中提供了一系列的字符串函数。字符串可与数值类型、布尔值类型的数据相互转换。
  • 数值(number)
    在XPath中数值为浮点数,可以是双精度64位浮点数。另外包括一些数值的特殊描述,如非数值NaN(Not-a-Number)、正无穷大infinity、负无穷大-infinity、正负0等等。number的整数值可以通过函数取得,另外,数值也可以和布尔类型、字符串类型相互转换。

其中后三种数据类型与其它编程语言中相应的数据类型差不多,只是第一种数据类型是XML文档树的特有产物。


XPath节点类型

另外,由于XPath包含的是对文档结构树的一系列操作,因此搞清楚XPath节点类型也是很必要的。回忆一下第二章中讲到的XML文档的逻辑结构,一个XML文件可以包含元素、CDATA、注释、处理指令等逻辑要素,其中元素还可以包含属性,并可以利用属性来定义命名空间。相应地,在XPath中,将节点划分为七种节点类型:

  1. 根节点(Root Node)
    根节点是一棵树的最上层,根节点是唯一的。树上其它所有元素节点都是它的子节点或后代节点。对根节点的处理机制与其它节点相同。在XSLT中对树的匹配总是先从根节点开始。
  2. 元素节点(Element Nodes)
    元素节点对应于文档中的每一个元素,一个元素节点的子节点可以是元素节点、注释节点、处理指令节点和文本节点。可以为元素节点定义一个唯一的标识id。元素节点都可以有扩展名,它是由两部分组成的:一部分是命名空间URI,另一部分是本地的命名。
  3. 文本节点(Text Nodes)
    文本节点包含了一组字符数据,即CDATA中包含的字符。任何一个文本节点都不会有紧邻的兄弟文本节点,而且文本节点没有扩展名。
  4. 属性节点(Attribute Nodes)
    每一个元素节点有一个相关联的属性节点集合,元素是每个属性节点的父节点,但属性节点却不是其父元素的子节点。这就是说,通过查找元素的子节点可以匹配出元素的属性节点,但反过来不成立,只是单向的。再有,元素的属性节点没有共享性,也就是说不同的元素节点不共有同一个属性节点。
    对缺省属性的处理等同于定义了的属性。如果一个属性是在DTD声明的,但声明为 #IMPLIED,而该属性没有在元素中定义,则该元素的属性节点集中不包含该属性。
    此外,与属性相对应的属性节点都没有命名空间的声明。命名空间属性对应着另一种类型的节点。
  5. 命名空间节点(Namespace Nodes)
    每一个元素节点都有一个相关的命名空间节点集。在XML文档中,命名空间是通过保留属性声明的,因此,在XPath中,该类节点与属性节点极为相似,它们与父元素之间的关系是单向的,并且不具有共享性。
  6. 处理指令节点(Processing Instruction Nodes)
    处理指令节点对应于XML文档中的每一条处理指令。它也有扩展名,扩展名的本地命名指向处理对象,而命名空间部分为空。
  7. 注释节点(Comment Nodes)
    注释节点对应于文档中的注释。

一个XML文档树

我们来构造一棵XML文档树,作为后面举例的依托:

	<A id="a1">
	  <B id="b1">
		<C id="c1">
		  <B name="b"/>
		  <D id="d1"/>
		  <E id="e1"/>
		  <E id="e2"/>
		</C>
	  </B>
	  <B id="b2"/>
	  <C id="c2">
		<B/>
		<D id="d2"/>
		<F/>
	  </C>
	  <E/>
	</A> 

以下将要介绍一些XPath中节点匹配的基本方法。


路径匹配

路径匹配与文件路径的表示相仿,比较好理解。有以下几个符号:

(1)用“/”指示节点路径
如“/A/C/D” 表示节点"A"的子节点"C"的子节点"D",即id值为d2的D节点, “/”表示根节点。

(2)用“//” 表示所有路径以"//"后指定的子路径结尾的元素
如“//E” 表示所有E元素,结果是所有三个E元素,如“//C/E”表示所有父节点为C的E元素,结果是id值为e1和e2的两个E元素 。

(3)用“*” 表示路径的通配符
如“/A/B/C/*”表示 A元素→B元素→C元素下的所有子元素,即name值为b的B元素、 id值为d1的D元素和id值为e1和e2的两个E元素
“/*/*/D”表示上面有两级节点的D元素,匹配结果是id值为d2的D元素 ,如“//*”表示所有的元素。


位置匹配

对于每一个元素,它的各个子元素是有序的。

如:/A/B/C[1]表示A元素→B元素→C元素的第一个子元素,得到name值为b的B元素

/A/B/C[last()]表示A元素→B元素→C元素的最后一个子元素,得到id值为e2的E元素

/A/B/C[position()>1]表示A元素→B元素→C元素之下的位置号大于1的元素,得到id值为d1的D元素和两个具有id值的E元素


属性及属性值

在XPath中可以利用属性及属性值来匹配元素,要注意的是,元素的属性名前要有"@"前缀。例如:

//B[@id]表示所有具有属性id的B元素,结果为id值为b1和b2的两个B元素

//B[@*]表示所有具有属性的B元素,结果为两个具有id属性的B元素和一个具有name属性B元素

//B[not(@*)]表示所有不具有属性的B元素,结果为A元素→C元素下的B元素

//B[@id="b1"] id值为b1的B元素,结果为A元素下的B元素


亲属关系匹配

XML文档可归结为树型结构,因此任何一个节点都不是孤立的。通常我们把节点之间的归属关系归结为一种亲属关系,如父亲、孩子、祖先、后代、兄弟等等。在对元素进行匹配时,同样可以用到这些概念。例如:

//E/parent::* 表示所有E节点的父节点元素,结果为id值为a1的A元素和id值为c1的C元素

//F/ancestor::* 表示所有F元素的祖先节点元素,结果为id值为a1的A元素和id值为c2的C元素

/A/child::* 表示A的子元素,结果为id值为b1、b2的B元素,id值为c2的C元素,以及没有任何属性的E元素

/A/descendant::* 表示A的所有后代元素,结果为除A元素以外的所有其它元素

//F/self::* 表示所有F的自身元素,结果为F元素本身

//F/ancestor-or-self::* 表示所有F元素及它的祖先节点元素,结果为F元素、F元素的父节点C元素和A元素

/A/C/descendant-or-self::* 表示所有A元素→C元素及它们的后代元素,结果为id值为c2的C元素、该元素的子元素B、D、F元素

/A/C/following-sibling::* 表示A元素→C元素的紧邻的后序所有兄弟节点元素,结果为没有任何属性的E元素

/A/C/preceding-sibling::* 表示A元素→C元素的紧邻的前面所有兄弟节点元素,结果为id值为b1和b2的两个B元素

/A/B/C/following::* 表示A元素→B元素→C元素的后序的所有元素,结果为id 为b2的B元素、无属性的C元素、无属性的B元素、id为d2的D元素、无属性的F元素、\无属性的E元素。

/A/C/preceding::* 表示A元素→C元素的前面的所有元素,结果为id为b2的B元素、id为e2的E元素、id为e1的E元素、id为d1的D元素、name为 b的B元素、id为c1的C元素、id为b1的B元素


条件匹配

条件匹配就是利用一些函数的运算结果的布尔值来匹配符合条件的节点。常用于条件匹配的函数有四大类:节点函数、字符串函数、数值函数、布尔函数。例如last()、position()等等,这里我们就不再赘述。

以上这些匹配方法中,用得最多的还要数路径匹配。在上一章样式表的例子中,无论是在语句<xsl:template match="学生花名册">中,还是在语句 <xsl:value-of select="名字"/>中,都是依靠给出相对于当前路径的子路径来定位节点的。

<!-- CMA ID: 162352 --><!-- Site ID: 10 --><!-- XSLT stylesheet used to transform this file: dw-article-6.0-beta.xsl -->

分享到:
评论

相关推荐

    xml入门项目——通讯录系统

    xml入门小项目——通讯录系统 系统特点: 1、系统主程序入口MainProgram.java 2、实现通讯录中联系人的增删改查功能,联系人数据保存在xml文档中。系统xml文档通过dom4j技术创建和解析。 3、涉及JavaSE中的集合、...

    [XML入门经典(第4版)].(Beginning.XML.4th.Edition).(美)亨特,(美)拉夫特,(美)福思特.扫描版.pdf

    《XML入门经典(第4版)》自第1版出版以来,一直是广大程序员学习XML的优秀入门教程。该书全面详实地介绍了XML的基本语法、基本用途和常用的开发工具和方法。全书共21章,分为8个专题。主要内容有XML基本语法、DTD、...

    XML 精要

    Essential XML Quick Reference (XML, XPath, XSLT, XML Schema, SOAP and more),有中文版了,中文版名为《XML精要:快速参考手册——XML, XPath, XSLT, XML Schema, SOAP》.用到的人会知道,这是一本不错的参考...

    C#XML入门经典 C#编程人员必备的XML技能.part2

    在.NET中使用XML &lt;br&gt;3.1 XML如何适合.NET 3.1.1 XML 3.1.2 文档对象模型(DOM) 3.1.3 命名空间 3.1.4 DTD和XML Schema 3.1.5 XPath 3.1.6 XSLT 3.2 .NET Framework使用XML 3.2.1 配置...

    xml字符串转化Dataset

    Microsoft的.NET围绕XML这一核心提供了一个强大而快速的开发工具——C#,它具有前所未有的高开发效率,特别是在XML编程方面。 C#提供了许多相关类处理XML数据,如处理stream的类: XmlReader和XmlWriter; DOM的类...

    ASP.NET——XML文件操作篇

    主要是对XML文件的写入和读取. 读取的方式分为:DOM读取,XMLReader读取,Xpath读取 XSL显示XML和XML文件的验证.

    XMLSpy 2011中文版破解补丁

    XML FO (XSL格式化对象:XSL Formatting Objects)说明可视的文档格式化,而 Xpath 则访问XML文档的特定部分。而 XSLT(XSL Transformations)就是把某一XML文档转换为其他格式的实际语言。 XSLT 是什么类型的...

    XMLSPY 2010 企业版

    XML FO (XSL格式化对象:XSLFormatting Objects)说明可视的文档格式化,而 Xpath 则访问XML文档的特定部分。而 XSLT(XSLTransformations)就是把某一XML文档转换为其他格式的实际语言。  XSLT 是什么类型的语言...

    Tinyxml 源代码(VC6 & VS2005)

    TinyXML支持UTF-8,所以可以处理任何语言的XML文件,而且TinyXML也支持“legacy模式”——一种在支持UTF-8之前使用的编码方式,可能最好的解释是“扩展的ascii”。 正常情况下,TinyXML会检测出正确的编码并使用它...

    每天30分钟 一起来学习爬虫——day10(解析数据 之 xpath,实例:好段子爬取)

    xpath: 是一门在xml 文档中查找信息的语言,这里,我们可以用xpath来查找html文档,它是一种路径表达式 常用的路径表达式: ​ 表达式 含义 // 不考考虑位置的查找 ​./ 从当前节点开始往下查找 ​ . . ...

    论文研究-The Implementation and Analysis of the Translation from Subtree Filtering to XPath.pdf

    实现与分析关于子树过滤到XPath的转换,申永浩,张彬,NETCONF是IETF组织提出的新的网络管理协议。该协议采用可扩展标记语言(XML)定义配置数据和协议消息,定义了新的过滤机制——子树过�

    Python的Xpath介绍和语法详解

    点Chrome浏览器右上角:更多工具—–扩展程序—–谷歌商店——–勾选XPath Helper(需要翻墙) 2.语法详解 #1.选取节点 ''' / 如果是在最前面,代表从根节点选取,否则选择某节点下的某个节点.只查询子一辈的节点 ...

    Android 创建与解析XML(五)——详解Dom4j方式

    dom4j is an easy to use, open source library for working with XML, XPath and XSLT on the Java platform using the Java Collections Framework and with full support for DOM, SAX and JAXP. dom4j官方网址:...

    兼容IE、FireFox、Chrome等浏览器的xml处理函数js代码

    在编写处理xml的网页时,经常为浏览器兼容性头疼。于是我将常用的xml操作封装为... 全部代码(zyllibjs_xml.js)—— 代码如下: /* zyllibjs_xml XML处理 @author zyl910 注意—— 1. Chrome 由于其安全机制限制, 不

    XML文档解析相关工具

    工具内容包括java程序开发中文件配置解析需要实用的jar包工具——[dom4j-1.6.1.jar]&[jaxen-1.1-beta-6.jar]

    O r a c l e与X M L

    它对W3C关于XML文档接口的两个主要标准—OM和SAX进行了讨论,同时也涉及到其他相关的XML技术标准如名字空间、XPath以及XSL变换等。随书光盘与Web站点你可以在随书光盘上找到Oracle XDK的产品版,它是相应于Java组件...

    用PHP读取和编写XML DOM

    XML 周围总有许多夸大之处和混淆之处。但是,并不像您想像的那么难 —— 特别是在 PHP 这样优秀的语言中。在理解并正确地实现了 XML 之后,就会发现有许多强大的工具可以...XPath 和 XSLT 就是这样两个值得研究的工具。

    Java学习指南(第4版)(下册)中文高清完整版PDF

    本书包括以下内容: 学习核心Java语言——基本语法、类和对象以及其他的组件; 用Java进行开发,使用编译器、解释器和其他工具; 介绍Java内建的线程工具和...使用XML和XSLT,包括XML Schema、验证、XPath和XInclude。

    用.NET框架实现序列化

    .NET框架提供的一种形式的序列化是XML序列化。在这种类型的序列化里,对象状态被以XML格式保存。这使得被序列化的对象能够...在与Xpath查询和Predicate方法一起使用的时候,XML序列化能够被用来实现面向对象的数据库。

Global site tag (gtag.js) - Google Analytics