注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

oldseedling的博客

 
 
 

日志

 
 

【引用】xml的学习  

2011-10-03 21:58:30|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
本文转载自风《xml的学习》
XML简介

2007-12-03 02:00:43

1. XML简介

XML(eXtensible Markup Language,可扩展标记语言)是SGML的一个子集,但比SGML简单,用以创建可相互转换的结构化文本文档和数据文档。下面说明一下与XML相关的一些概念。

? XML(eXtensible Markup Language,可扩展标记语言),继承了SGML的优点,但又没有了SGML的复杂性。XML专门为WEB应用而设计,和HTML不同,它是一种元标记语言(meta-markup language),也就是说它没有一套能够适用于各个领域中所有用户的固守的标签和元素,相反,它允许开发者根据自已的需要定义自已的元素,XML中的X(eXtensible)就是说明了这一点。它的特点有:

o XML使用Unicode字符集,可生成英文、中文、希腊文或梵文等多种语言。

o 可将多个来源(包括其他XML文档和二进制文件)汇合进一个XML文档。

o 可利用DTD或Schema(模式)管理一致性问题。DTD主要用于文档型文档,Schema主要用数据型文档。

o 具有很好的扩展性,可定义自已的元素和属性。

o 通过XML可从关系数据库管理系统中提取数据到结构化文档。它还被设计成可对各种数据对象进行操作。

o 在一个设计良好的XML应用中,XML标记不涉及文档如何显示,只表示文档的结构。

XML被设计用来存储、支持和交换数据,而不是用来显示数据的。通常,XML被用于数据交换,而不是数据存储。

? 元数据,定义数据的数据。

? 标记语言是一种定义文档的格式语言。SGML、XML、XHML、HTML都属标记语言。

XML文档是什么?它有时是一个文件,有时是关系数据库中的一条记录,有时是由Object Request Broker(对象请求代理程序)传送的一个对象,有时是到达网络接口的一个字节流。XML文档可使不同系统、不同平台的数据实现统一接口,这就是XML真正的威力所在。下面列举几个使用XML的领域:

? 文档设计和管理,可利用XML维护公司的文档资料。

? Web开发,利用XHTML和XSLT实现的Web页面扩展性更好,更容易维护。

? 数据库应用和程序开发,可从数据库中提取数据并生成XML文档,实现信息的跨平台、跨系统沟通。

? 定义其它语言,WML和WAP就是用通过XML建立的。

XML不是什么?

? XML只是一种标记语言,不是一种编程语言。不存在一种编译器,把XML文档转化成可执行二进制代码。

? XML不是一种网络传输协议,但通过网络协议传输的数据格式则可以是XML格式的。

? XML不是数据库,不能替代Oracle或MySQL这类的关系数据库管理系统。

2. XML语法

2.1. 基本语法规则

2.2. 良构XML文档和有效XML文档

2.3. XML文档的组成

2.4. XML文档树

创建一个简单的index.xml文档:

Hello World 下面创建一个名为basic.xsl的XML样式表(XSL),以便在浏览器中显示XML文档内容:

接着在浏览器中打开index.xml文档,则可显示“Hello World”。上面两个文档都是合法的XML文件,具体的语法规则下面会详细介绍,上例可先给大家一个感性的认识。

合法的XML文档可有种意思,一个是良构文档(well-format),即符合XML规则书写的文档;另一种是有效文档,是已验证符合一个DTD的文档。

2.1. 基本语法规则

? XML是区分大小写的;

? 所有元素的起始和结束标注必须成对出现,且要正确嵌套;

? 如果使XML说明,则它必须是XML文档的第一行:

? ? 元素属性必须用引号引起来,单、双引号都可以,但必须成对出现。如:

? ? ? XML命名规则:

o XML名以下划线或字母开始;

o XML名可包含字母、数字、句点、下划线和冒号;

o XML名不能包含空格;

o XML名不能以数字开始,但可包含数字;

o XML名区分大小写。

? 保留标记字符,如果要在XML中显示<或&之类的标记,就要使用字符的实体形式,XML中有五种预先定义了的实体:

? < 表示<字符

? > 表示>字符

? & 表示&字符

? ' 表示'字符

? " 表示"字符

我们也可用ENTITY自定义实体:

这样我们可用&linux;来调用。

? XML文档内容中的空格是有意义的,在转换后会保留。

? 空元素以<开始并以/>结束,如

2.2. 良构XML文档和有效XML文档

符合XML语法规则的XML文档称为良构文档,这些规则如下:

? 应当只有一个父标志,由父标志派生所有其它子标志,在一个文档中不能存在多个父标志。

? 嵌套元素应按正确的顺序开始和结束。

? 子标志应在父标志完成前关闭。

? 属性值应放在双引号中。

通过某个DTD或Schema验证的文档称为有效XML文档。

2.3. XML文档的组成

? XML声明:

o version,定义XML规范的版本号,到现在为止,只有一个版本号1.0。

o encoding,指定文档的编码系统。

o standalone, 定义文档是独立的还是需要装入其他元素才能正确分析。如果XML文档没有外部实体或DTD,则可以设置为no,否则设置为yes。可用该值提高性能:如果 为no,则可提高处理速度;如果设置为yes,则首先要分析文档,确定需要其他哪些文件,然后才能完全分析文档。

? 根元素,每篇XML文档都需要有且只能有一个根元素。由元素是文档的第一个元素,包含其它所有元素。下例的portal就是根元素,如:

? ? jims ? ? ...

? ? 属性,每个元素都可以设置一个或多个属性,如:

? ? Jims ? 元素和属性都可以表示信息,什么时候使用元素,什么时候使用属性呢?属性信息表现能力有限,它只能表示字符串。所以当需灵活表示信息时应该使用元素。一般把信息主体放到元素中,属性只放一些注释或额外的信息。

? CDATA部份,它用“”表示,它们之间的数据作为原始字符显示,唯一不能出现的标志是]]>。

? 注释,注释是很重要,不论是在编写程序和文档时,所以XML也提供了注释功能,以结尾的一对区间为注释。在以-->结束之前,不能出现“--”号,“---”更不允许。

? 处理指令,处理指令以结尾。如PHP处理指令可写成,。处理指令是标记,而不是元素。因此,与注释一样,处理指令可出现在XML文档的标签外的任何位置,包括根元素之前或之后。最常见的处理指令是,xml-stylesheet样式表指令,它会告诉浏览器在显示文档时应用什么样式表。如:

? ? ? ... ? ...

? 2.4. XML文档树

XML文档是一种结构化的文档,可用树的形式表示出来。树是一种由节点和分支组成的简单结构,两个节点间由分支连接。上端的节点称为父节点,下端的 节点称为子节点。一个节点如果没有父节点,则称为树的根节点(根),每个树必须有且只能有一个根节点。一个节点如果没有子节点,则称为树的叶节点。只有一 个节点的树也是允许的。

3. DTD

3.1. 文档类型声明

3.2. 元素声明

3.3. 属性声明

3.3.1. 属性类型

3.3.2. 属性缺省值

3.4. 实体

由于XML可自定义标签,所以每个人定义的标签集都会不同,如果没有一套标准来规定标签的定义原则,则应用程序就不能对XML文档进行处理。解决该 问题的方案采用DTD,DTD(Document Type Definition,文档类型定义),用于定义XML文档的编写规则。如哪些元素可出现在文档中,及元素的内容和属性的要求等。应用程序会利用这个 DTD对文档进行检验,符合DTD约束规则的XML文档称之为有效文档,可以进行下一步处理,否则会报错,应用程序可捕获该错误进行相应的异常处理。检验 过程是可选,这要视具体应用而定。

3.1. 文档类型声明

要使用DTD进行有效性检验,就要使用文档类型定义声明指定DTD。如:

Jims Jims@163.com Jims@21cn.com 文档类型声明位于XML声明之后,根元素之前。如果dtd文档位于本机,可用路径名直接指出dtd文档的位置。portal.dtd的内容如下:

上面的内容也可直接写到XML文档内,这种dtd声明方式叫内部dtd子集,如:

]> Jims Jims@163.com Jims@21cn.com 如果dtd位于XML文档外,则叫外部dtd子集。我们可以结合内外dtd,共同组成一个dtd来为XML文档作验证。如:

]> 注意,使用内外dtd时,这两个dtd要互相兼容,不能有冲突。

3.2. 元素声明

上节文档类型声明中的每一项都是元素声明,定义了每个元素的约束。元素声明的格式为:

content_model:元素类型

1. EMPTY-该元素不能包含子元素和文本,但可以有属性-(空元素)

2. ANY-该元素可以包含任何在DTD中定义的元素内容

3. #PCDATA-可以包含任何字符数据,但是不能在其中包含任何子元素

其它类型(组合)-一个元素本身是由其它元素的集合组成

有效文档中使用的每个元素都必须在文档的DTD中用元素声明进行声明。element_name可是任何合法的XML名称,content_model(内容模型)指定元素可以或必须包含的子元素以及子元素的顺序。下面具体介绍内容模型的内容。

? #PCDATA,规定元素只包含已析的字符数据。下面声明指出一个name元素可以包含文本,但不能划分为独立的area_code、number和extension元素:

? ? 子元素,可指明元素的子元素。下面声明表示name元素必须包含且只包含一个desc元素。

? 也可用逗号为分隔符,指明多个子元素。并且子元素出现的次序必须按定义时的顺序。如:

name元素的id子元素必须在desc子元素前面,否则验证会出错,该文档不是一个有效的XML文档。

下面这个文档是有效的

1 dtd test

下面这个文档是无效的,顺序颠倒了

dtd test 1

下面的文档也是无效的,有多余的元素

1 dtd test 2005/01/31 ? 子元素的个数,我们可通过正则表达式来规定子元素的个数。

o ?,允许零个或一个该元素

o *,允许零个或多个该元素

o +,允许一个或多个该元素

下面我们可利用这些符号规定id子元素必须出现,且只能出现一次,而desc子元素可选。

根据上面的声明,下面的name元素都是有效的。

1 dtd test

2

3 dtd test another test ? 可选项(|),选项是一个参数列表,每个参数间用“|”分隔,代表能且只能选一个子元素。

? 上例的choice元素可选一个good子元素,或bad子元素,且只能从选一个。可选的参数列可以多项,不限于两项。如:

? 小括号,可用小括号把选项括起来,以表达更丰富的意思,如我们想表示choice元素必须包含一个good子元素,并且必须包含ok子元素或bad子元素的一个。

? ? 混合内容,在一些文档中,一个元素可能既包含子元素,也包含字符串,这些内容叫混合内容。可用以下方式表示:

? 该声明表示description元素可包含已析的字符串和term子元素,且允许出现零次或多次,如:

this is a dtd test.

#PCDATA必须在第一位,可选的子元素可任意多项。

? 空元素,某些元素不用包含任何内容,称之为空元素。写成以/>结束的独立标签。

? 示例:

【引用】xml的学习 - oldseedling - oldseedling的博客 ? ANY,允许元素内包含任意内容。该选项在dtd测试时很有用,在生产系统中尽量不要使用。

? 3.3. 属性声明

一个有效的XML文档,必须对元素的属性进行声明。使用ATTLIST声明来完成,一个ATTLIST可以为一个元素类型声明多个属性。

上例声明image元素必须有一个src属性,该属性的值是字符数据。可用ATTLIST声明为一个元素声明多个属性,如:

width CDATA #REQUIRED

height CDATA #REQUIRED

alt CDATA #IMPLIED

> 上述声明指出src、width、height属性是必须的,alt属性是可选的。

3.3.1. 属性类型

? CDATA类型属性值可包含任意文本字符串。DTD不能指定属性为一个整数或一个日期,Schema能提供更为强大的数据类型。

? NMTOKEN 类型属性值是一个XML名称记号。XML名称记号与XML名称类似,但XML名称记号允许所有的字符作为名称的开始字符,而XML名称的第一个字母必须是 字母、表意字符和下划线。因此10,.bashrc是合法的XML名称标记,但不是合法的XML名称。每个XML名称都是一个XML名称标记,然而XML 名称标记不全是XML名称。如果属性包含1990,2005之类的整数,则应该指定其类型为NMTOKEN。如:

? ? NMTOKENS类型属性包含一个或多个用空白分隔的XML名称记号。如:

? person 对应的声明应为:

另一方面,对01/02/2005这样的形式不能使用该声明,因为其中的正斜杠不是合法的名称字符。

? 枚举声明,枚举不用关键字。直接列举所有的值,中间用竖线分隔。如:

? 针对上述声明,date元素的month属性可选十二个月份的中一个。

? ID类型的属性必须包含一个XML名称,而且该名称在文档中是独一无二的。ID属性可为元素分配一个唯一的标识符。

? 由于数字不是合法的XML名称,所以ID编号不能以数字开头,解决办法是在前面加下划线或字母。

? IDREF类型的属性指向文档中某元素的ID类型的属性。因此,它必须是一个XML名称,它的作用是当简单的包含关系不能满足要求时在元素间建立多对多关系。如:

? ? deploy linux ? ? ?

? ? linuxsir ? ? project元素的project_id属性和person元素的card_id属性应该是ID类型。 team_member元素的person_card_id属性和assignment元素的project_project_id属性是IDREF类 型。对应的声明如下:

? IDREFS类型的属性包含一个XML名称列表。名称间用空白间隔,且每个名称都是文档中某个元素的ID。当某个元素需要引用多个其他元素时使用该元素。如:

?

? assignment IDREFS #REQUIRED> ?

? team IDREFS #REQUIRED> 对应的文档可写成:

deploy linux

Linuxsir ? ENTITY类型的属性包含在DTD的其它位置声明的未析实体的名称中。如movie元素可能有一个标识激活时播放mpeg或rm文件的实体属性:

? 如果DTD声明了一个名为play的未析实体,则此movie元素可用于在XML文档中嵌入视频文件:

? ENTITIES类型的属性包含在DTD的其它位置声明的多个未析实体名称,其间用空白隔开。

? 如果DTD声明了未析实体slide1、slide2、slide3、...,则可使用slide_show元素在XML文档中嵌入幻灯片。

? NOTATION类型的属性包含在文档的DTD中声明的某个记法的名称。该属性类型较少用。理论上,可以使用该属性使某些特殊元素与类型相关联,下例声明为不同的图像类型定义了4个记法,然后规定每个image元素都必须从中选择一种type属性。

? ? ? ? ? 每个image元素的type属性的值可以为gif,tiff,jpeg和png四个值中的一个。该属性比枚举类型稍具优势, 因为记法的实际MIME媒体类型在理论上是可用的。由于斜杠在XML名称中不是一个合法字符,所以枚举类型不能指定image/png或 image/jpeg作为允许值。

3.3.2. 属性缺省值

每个ATTLIST声明除了要提供一种数据类型外,还要声明属性的缺省行为。

? #IMPLIED,属性可选,可有可无。

? #REQUIRED,属性必须有。

? #FIXED,属性是常量,不能更改。

?

? Literal,作为一个引用字符串的实际缺省值。

?

如果没有显示指明person元素的name属性,则该值为linuxsir。

3.4. 实体

? 用ENTITY声明定义实体。如:

? ? 用“&linux;”可引用该字符串,以分号作为结束。

? 可定义一个外部实体,引用外部XML文档

? ? 使用&linux;可引用/home/linux/test.xml文档

外部实体没有XML声明,但可以有文本声明,两者很类似,主要区别是文本声明必须有编码声明,而版本信息则是可选的。

是一个合法的文本声明

也是一个合法的文本声明

? 不是所有的数据都是XML。如jpeg照片,mpeg电影等。XML建议使用外部未析实体作为在文档中嵌入这些内容的机制。DTD为包含非XML数据的实体指定一个名称和URI。

? 由于数据不是XML格式,所以使用NDATA声明指定数据类型。avi是在NOTATION中定义的MIME媒体类型。在XML中嵌入未析实体很复杂且不规范,尽量不要使用。

? 参数实体可定义一组通用的实体,在文档中可通过该参数实体来引用实体。参数实体的定义与通用实体定义类似,只是中间多了一个%,引用时也是用%代码&。

? ? 引用方法

? %person;

? 这样会用name,address,postcode代替参数实体%person;

? 通常DTD都比较大,DocBook的DTD长达11000多行,如果把它存放在单一文件中,管理和维护起来都非常困难。我们可以使用外部DTD子集,把一个大的DTD按功能分成不同的功能块,存放在不同的文件中。再通过外部参数实体声明引入当前DTD中,如:

? 定义参数实体引用外部names.dtd

? ? 调用外部DTD子集

? %names;//

? 使用IGNORE关键字可注释声明,如:

?

? 当然了,使用的方式也是一样的。

? INCLUDE关键字表示DTD中的确在使用给定的声明,如:

?

? 单从该声明来看,有没有使用INCLUDE效果都一样,但如果组合INCLUDE和IGNORE,可实现DTD功能的选择。我们可定义一个参数实体:

然后使用参数实体引用而不使用关键字:

按上述操作,元素声明是有效的,但我们也可以把参数实体%note_allowed重新定义为IGNORE,这样,该元素声明就无效了。

4. XML名称空间

? XML名称空间表示XML名称的使用范围,因为XML可自定义元素标签,所以有不同 XML应用间XML名称重名的机会是很大的。如果没有一种方法来区分不应用的名称,就会造成混乱。XML名称空间就是为了解决这个问题而设计的。通过 XML名称空间,我们可以区分来自不同的XML应用的具有相同名称的元素和属性。可以将来自单一XML应用的相关元素和属性集合在一起,方便软件识别和处 理。

? 名称空间由前缀和本地部分组成,中间用冒号分隔。前缀标识元素或属性的所在名称空间,本地部分标识名称空间中的某个元素或属性。整个名称也称为限定名称(qualified name)。前缀可以用除XML(大小写任意组合)三个字母外的任何合法的XML名称字符组成。每个限定名称中的前缀都必须与唯一的一个URI关联。带有相同URI关联的前缀的名称属于同一名称空间。

? ? ? ? linuxsir ? ...

? ? 上例rdf:RDF元素的xmlns:rdf属性将前缀rdf绑定到名称空间http: //www.w3.org/TR/REC-rdf-syntax#。属性xmlns:rdf为rdf:RDF元素及其子元素声明了前缀rdf。RDF处理 器将把rdf:RDF和rdf:Description作为RDF元素,因为两个元素都具有与RDF规范定义的某个URI相绑定的前缀。处理器不会认为 title,author等元素为RDF元素,因为它没有绑定到相同URI的rdf前缀。

前缀一般在使用该前缀的最上层元素中定义。在下层元素中也可定义不同的前缀:

about="http://www.example.com/test.xml"> example linuxsir ...

不带前缀的属性,如about,不属于任何的名称空间。如xlink:type和xlink:href属性属于xlink名称空间,当然,前提是你要先把xlink绑定到一个URI。URI不必须是一定存在的http链接,它只是一种表示的方法,以区分不同的名称空间。

? 通过将无前缀的xmlns属性附加到根元素中,可以指定不带前缀的元素及所有不带前缀的子元素属于某个名称空间。

? ? ? ? 这里,虽然所有元素都没有前缀,但它都同属一个名称空间。但属性属不同名称空间,因为默认名称空间只应用于元素。默认名称空间在子元素中也用相同的方法重新设置。

? 如果名称空间只用来识别来自某种XML应用的元素和属性,而不是用来区分具有相同名称的不同元素,则可在DTD的元素中定义一个固定的xmlns属性,而不需要文档中定义。定义方法如下:

? ? 在定义DTD时,需要使用名称空间前缀的在定义时也要把前缀写到DTD定义里,如:

? ? 使用参数实体引用来定义名称空间前缀可方便DTD文档的维护,如:

? ? 接着,利用该参数实体名称定义更多的参数实体引用,如:

这样,如果需更改前缀,只需修改一个地方就可以了,不用整篇文档修改。

不能在ATTLIST和ELEMENT声明中直接使用%prefix;和%colon;,因为在另一个实体的外部使用这些参数实体时,XML解析器会在实体替换文本的两边添加额外的空格。

5. 样式表

5.1. XSLT

5.2. XPath

5.2.1. 匹配模式

5.2.2. XPath轴

5.2.3. 谓词

5.2.4. XPath表达式

5.2.5. XPath函数

5.3. XLink

样式表可帮我们解释XML文档中各元素的具体意思,所以通过样式表可直接在浏览器上显示XML文档。目前主要的样式表语言有:

? CSS1(Cascading Stylesheets Level 1,层叠式样式表1)

? CSS2(Cascading Stylesheets Level 2,层叠式样式表2)

? XSLT(XSL Transformations 1.0 XSL 转换 1.0)

在XML文档在序言部分通过xml-stylesheet处理指令可指定关联的样式表。xml-stylesheet指令必须有一个href属性和 type属性。href指向样式表的URL,type指定样式表的MIME类型:对CSS为text/css,对于XSLT为text/xml或 application/xml。下面是一个简单的使用样式表的XML文档:

...

除以上两个必须的属性外,还有4种可选属性:

? media,标识该样式应用于什么媒体,如报纸(paper)、计算机监视器(screen)、电视(tv)或所有(all)。

? charset,指明样式表采用字符集编码方式,如:utf-8。

? alternate,指明是否有可选的样式表,默认为no,表明是主样式表,如果为yes,则是备用样式表。

? title,在有alternate的前提下,title用于指定不同样式表的标题。如:

? ? ? #默认的主样式表

样式表现在已成为Web应用中的一个关键技术,它的作用主要体现在以下三个方面:

? 设计一个样式表可以应用于多个文档。样式表可以存在于XML文档外,XML文档可通过链接使用样式表。这意味着如果你有几千个文档,都可以链接到同一个样式表中,改变一个样式表等于改变几千个文档的显示效果。

? 实现内容和表现的分离,增强文档的一致性和可维护性。通过单一的样式表,实现所有文档显示的一致。如果显示样式有变动,我们只需维护有限的几个样式表就可以了。

? 实现一个文档,多个样式。通过样式表,可把一篇文档以HTML形式、PDF形式或文本形式显示出来。

5.1. XSLT

XSLT是XSL的一部份,它是XML的一种应用,指定将一篇XML文档转换成另一种XML文档的规则。XSLT文档即是一篇XML文档,也是一个 样式表,里面包含一系列的模板。XSLT处理器对输入XML文档中的元素和样式表中的模板进行比较,如果匹配,则将该模板的内容写入一个输出树中。完成处 理后,将输出树串行化成一篇XML文档或其它格式的文档,如HTML或者rtf。

XSLT几个关键术语

? 源树,原始文档中的元素和元素内容的树。

? 结果树,转换之后中文档中的元素和元素内容的树。

? 模板规则,XSLT样式表的基础,分为模式和模板两部份。整个xsl:template元素。

? 模式,表示源树中的元素与模式规则匹配的条件集合。xsl:template中的match的值。

? 模板,表示当应用模板规则时,结果树中要实例化的部份。xsl:template元素中的内容。

XSLT定义了35个元素,分为三类:

两个根元素

? xsl:stylesheet根元素,XSLT也是一个XML文档,该文档的根元素就是 xsl:stylesheet。XSLT元素都属于名称空间xmlns:xsl="http: //www.w3.org/1999/XSL/Transform",所以所有的XSLT元素都有xsl前缀。一个最小化XSLT文档:

? ? ? ? xsl:transform元素,作用同上。

13个顶级元素,可直接作为根元素的子元素,包括:

? xsl:apply-imports

? xsl:attribute-set

? xsl:decimal-format

? xsl:import

? xsl:include

? xsl:key

? xsl:namespace-alias

? xsl:output

? xsl:param

? xsl:preserve-space

? xsl:strip-space

? xsl:template模板元素,用于匹配XML文档中的元素。如:,匹配XML文档中的person元素。

? xsl:variable

20个指令元素

? xsl:apply-imports

? xsl:apply-template应用模板元素,用于显示指定的元素值(内容)。如:,显示name元素的值。

? xsl:attribute

? xsl:call-template

? xsl:choose

? xsl:comment

? xsl:copy

? xsl:copy-of

? xsl:element

? xsl:fallback

? xsl:for-each

? xsl:if

? xsl:message

? xsl:number

? xsl:otherwise

? xsl:processing-instruction

? xsl:text

? xsl:value-of选择元素,用于计算元素的值(内容)。如:,获得XML文档中name元素的值(内容)。

? xsl:variable

? xsl:when

XSLT函数

?

5.2. XPath

XPath是一种用来从文档树中选择节点和节点集的语言。从XPath的角度来看,共有七种节点:

? 根节点

? 元素节点

? 属性节点

? 文本节点

? 注释节点

? 处理指令节点

? 名称空间节点

CDATA部份,实体引用和文档类型声明不包括在内,XPath在所有这些项都并入文档之后才起作用。根节点和根元素是不同的两个概念,根节点包含整篇文档,包括根元素。

5.2.1. 匹配模式

匹配模板的通用模式

模式 描述

match="E" 匹配元素E

match="*" 匹配任意元素

match="E|F" 匹配元素E和F

match="E/F" 匹配以E为父元素的元素F

match="E//F" 匹配以E为根元素的元素F

match="/" 匹配根节点

match="text()" 匹配文本节点

match="comment()" 匹配注释节点

match="processing-instruction()" 匹配处理指令

match="node()" 匹配除属性节点和根节点外的节点

match="id(test)" 匹配具有唯一ID test的元素

match="E[@CLASS="foo"] 匹配元素E,其类属性为foo

match="E[F]" 匹配元素包含有F元素的E元素

5.2.2. XPath轴

XPath提供了选择节点的机制,两个较有用的是轴选择和谓语选择,轴指定上下文节点和要选择的节点的关系。共有十三种轴,最常用的有四种,分别是子轴(child)、属性轴(attribute)、自已(self)、双亲(parent)。

Table 6.2. XPath轴描述

轴 描述

child 包含当前节点的儿子

descendent 包含当前节点的后代,后代不包含属性(attribute)或名称域(namespace)节点

parent 包含当前节点的父亲

ancestor 包含当前节点的祖先,祖先总是包含根节点

following-sibling 包含当前节点随后的所有节点树,但不包含attribute或namespace节点

preceding-sibling 包含当前节点之前的所有节点树,但不包含attribute或namespace节点

following 包含当前节点随后的所有节点,following轴排除了当前节点的后代和attribute或namespace节点

preceding 包含当前节点之前的所有节点,following轴排除了当前节点的后代和attribute或namespace节点

attribute 包含当前节点的所有属性

namespace 包含当前节点的所有namespace节点

self 只包含当前节点

descendent-or-self 包含当前节点和当前节点的后代

ancestor-or-self 包含当前节点和当前节点的祖先

5.2.3. 谓词

XPath表达式可以匹配多个节点,如需对匹配的节点进行进一步的筛选,可以使用谓词。

Table 5.3. 选择节点常用谓词

谓词 描述

select="E" 选择是当前节点的孩子的E元素

select="" 选择当前节点的孩子的所有元素

select="text()" 选择当前节点的文本节点孩子

select="@name" 选择当前节点的name属性

select="@*" 选择当前节点的所有属性

select="E[1]" 选择当前节点的孩子的第一个E元素

select="E[last()]" 选择当前节点的孩子的最后一个E元素

select="*/E" 选择当前节点的孙了的所有E元素

select="E//F" 选择从当前节点的孩子的E元素派生而来的元素F

select="//" 选择根元素

select="//E" 选择从根节点派生而来的E元素

select="//E/F" 选择所有是从根节点派生而来的E元素的孩子的F元素

select="." 选择当前节点

select=".//E" 选择从当前节点派生而来的所有E元素

select=".." 选择当前节点的父节点

select="../@name" 选择当前节点的父节点的name属性

select="E[@name='foo']" 选择所有是当前节点的孩子,并且其name属性具有foo值的E属性,除等号外,还可用<,>,<=,>=和!=

select="E[@foo and @bar]" 选择所有包含foo和bar属性的E元素

home/person/@id这种定位路径的写法叫简写定位路径,该写法简洁,容易理解,是XSLT匹配模式中最常用的写法。还有一种称为非简写 定位路径的写法,它把节点测试和轴结合在一起,如child::home/child::person/attribute::id。该写法在实际使用中 不常用,但它具有非常重要的性能因此有必要了解。

5.2.4. XPath表达式

位置路径是XPath的一个最常用的表达式,用以标识XML文档的节点集。除此之上,XPath表达式还可返回数字、布尔和字符串。非节点集的 XPath表达式不能用于xsl:template元素的match属性中。它们用于xsl:value-of元素的select属性值或用于位置路径的 谓词中。

每个XPath位置路径可分为一步名多步,每步以“/”号分隔,如:

room[\@name=$root]/date[year=$year and month=$month]/meeting

上下文节点即当前正在处理的节点,也就是位置路径定位的当前节点。上下文在XPath表达式计算前被创建,由XSLT处理器创建。处理每一步后,上下文都会改变。

位置路径中的步可分为三部份:轴(axis)、节点测试(note test)和谓词(predicate),它的写法如下:

axis::note-test[predicate]

轴和节点测试之间用“::”分开,每个谓词由括号[]括起来。

要设计好一个位置路径,需确保在每一步选择最少的节点,使用最严格的轴,用最严格的节点测试。避免使用谓词,因为由轴和节点测试选择的节点集的每个节点都会用作谓词的上下文节点。对于位置路径的三步,最节省的是节点测试。

XPath中的所有数字都是8个字节的IEEE754浮点双精度类型,与java的double类型相同。可表示正无穷大、负无穷大和NaN(零除零)值。支持五种运算符,分别是加(+)、减(-)、乘(*)、除(div)、取余(mod)。

XPath中的字符串是Unicode字符,用单引号或双引号定界。可以使用=和!=对字符进行比较,也可用<,>,<=,>关系运算符,但比较的两个字符必须是数字,否则比较结果没有意义。

XPath中的布尔值常用于位置路径的谓词中,如/person[name="debian"]。布尔值还常用于xsl:if和xsl:when元素的test属性中。如:

5.2.5. XPath函数

XPath还提供很多函数,用于表达式和谓词。XPath函数的返回值有四种类型,分别是:

? 布尔值,如:true()返回ture(真),false()返回false(假),not()对布尔值取反。

? 数字,如:number()把任意类型转化数字,celing()返回大于或等于参数的最小整数。

? 节点集,如:position()返回当有节点在上下节点列表中的位置,count()可统计节点数。

? 字符串,如:string()转化任意类型为字符串,string-length()返回字符串长度。

5.3. XLink

XLink是一种基于属性的语法,用来在XML文档中添加链接。XLink链接可以是单向的,如HTML中的A元素,它也可以是双向的,在两个方向 上链接两篇文档,因此能够从A到B或从B到A。每个XLink元素必须具有一个xlink:type属性,指出连接类型。属性xlink:href指向所 链接的资源URI。下面是一个简单链接的示例:

xlink:type = "simple"

xlink:href = "http://www.ringkee.com/xml.html"> Jims 2005/02/18 xlink:type属性类型共有六种,分别是:simple,extended,locator,arc,title,resource。

xlink:show属性可告诉浏览器或应用程序在激活链接时应该做什么,它有五种可能的动作,分别是:

? new,在新窗口中显示链接内容。

? replace,在当前窗口显示链接内容。

? embed,在当前链接元素的位置嵌入内容。

? other,动作不确定,由应用程序指定。

? none,无动作。

xlink:actuate属性可告诉浏览器何时显示链接,它有四种可能值:

? onLoad,一旦发现链接,马上显示。

? onRequest,当用户提出请求时才显示。

? other,由文档中的其它标记,而不是xlink,来决定何时显示。

? none,不指定。

一个和HTML中的A元素作用一样的示例:

xlink:type = "simple"

xlink:href = "http://www.ringkee.com/xml.html"

xlink:actuate = "onRequest"

xlink:show = "replace" > Jims 2005/02/18 一个在页面嵌入图像的示例:

Image

xlink:actuate = "onLoad"

xlink:show = "embed"

xlink:href="http://www.ringkee.com/flower.png"

width = "320" height = "240" /> xlink:actuate和xlink:show是可选的。

xlink:title和xlink:role属性可指定资源之间的描述,xlink:title包含少量描述远程资源的文本,xlink:role包含URI,指向资源的较长描述。

A. 附录

A.1. XML相关技术名词解释

? XLink,一种基于属性的用于XML和非XML文档之间超链接的语法,可以提供与HTML相似的简单、单向的链接,多文档之间的多向链接,以及没有写入权限的文档间的链接。

? XSLT(XSL Transformation,XSL转换),一种XML文档,用于描述具有相同或不同XML词汇表的两个文档之间的转换。

? XSL-FO(XSL Formatting Object,XSL格式化对象),一种用于描述打印和网页布局的XML应用。

? Dsssl(Document Style Sheet and Semantics Language,文档样式表和语义语言),用于描述XML打印和在Web上的样式,源自SGML。

? XPointer,标识XML文档中由URI指定的特殊部分,通常与XLink结合使用。

? XPath,用于标识XML文档中的路径。

? Namespace,区分来自不同的XML语汇表但名称相同的元素和属性的一种方式。

? SAX,Simple API for XML,一种事件驱动的XML文档处理器。

? DOM,Document Object Model,一种面向树的API,它把XML文档解释成具有多属性和嵌套的对象树。

  评论这张
 
阅读(30)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017