W3C给出了两种样式表语言的推荐标准,一种是层叠样式表CSS,另一种是可扩展样式表语言XSL。层叠样式表CSS是一种样式描述规则,目前W3C有两个推荐标准,CSS1和CSS2。CSS2是在CSS1的基础上制定的,基本上涵盖了CSS1,并在CSS1的基础上增加了媒体类型、特性选择符、声音样式等功能,并对CSS1原有的一些功能进行了扩充。
CSS制定之初的服务对象并不是XML,而是针对HTML提出的样式表语言,但同样可以很好地应用于描述XML文档的表现。利用CSS可以定义HTML或XML文档中元素的显示效果,包括元素的位置、颜色、背景、边空、字体、排版格式。
CSS是一种静态的样式描述格式,不遵从XML的语法规范。而XSL是通过XSL进行定义的,遵守XML的语法规则,是XML的一种具体应用。XSL本身就是一个XML文档,系统可以使用同一个XML解释器对XML文档及其相关的XSL文档进行解释处理。
XSL由两大部分组成:第一部分描述了如何将一个XML文档转换为可浏览或可输出的格式;第二部分定义了格式对象FO(formatted object)。输出时,首先根据XML文档构造源树;然后根据给定的XSL将这个源树转换为可以显示的结果树,这个过程称作树转换;最后再按照FO解释结果树,产生一个可以在屏幕上、纸上、语音设备或其他媒体中输出的结果,这个过程称作格式化。
到目前为止,W3C还未能出台一个得到多方认可的FO,但是描述树转换的这一部分协议却日趋成熟,已从XSL中分离出来,另取名为XSLT。与XSLT一同推出的还有其配套标准XPath,这个标准用来描述如何识别、选择、匹配XML文档中的各个构成元件,包括元素、属性、文字内容等。
XSLT主要的功能就是转换,它将一个没有形式表现的XSL内容文档作为一个源树,将其转换为一个有样式信息的结果树。在XSLT文档中定义了与XSL文档中各个逻辑成分相匹配的模板及匹配转换方式。尽管制定XSLT规范的初衷只是利用它来进行XML文档与可格式化对象之间的转换,但它却表现在可以描述XML文档向任何一个其他格式的文档作转换的方法,例如转换为另一个逻辑结构的XML文档、HTML文档、XHTML文档、VRMI文档、SVG文档等。
3.文档资源间的链接语言——XLink
XLink是描述在资源间进行链接的语言。链接反映了不同资源对象之间的关系,而对象的选择是由定位来描述(这就是XPointer的职责)。
在XML1.0标准中规定的ID和IDREF标号类型属性就是建立简单链接关系的情况,XLink对这种基本功能进行了不同方面的扩展。
XLink可以声明多个资源之间的关系。资源这个概念对于WWW来说是具有普遍意义的,资源可以是任何信息或服务的可定位的单元,具体的资源例子有文件、图像、文档、程序和查询结果。所以定位资源是非常重要的环节,一般用XPointer进行资源的定位。当一个链接和一个资源的集合相联系,就认为这些资源加入了这个链接的队列。当然XLink可以链接任何资源,而不仅仅是XML文档的一部分。
XLink可以明确地将元数据(即资源内容)和链接相结合。XLink所链接的资源可以以不同的形式表示,比如在一个新开的窗口中显示,在链接处嵌入或者是代替开始的文档,用户可以根据具体情况进行设置。XLink提供附加函数,如行外链接(out-of-linelink)等。XLink的一个重要应用是用于超文本链接。简单的超文本情况类似于HTML中的A元素,但XLink中定义的链接远远超出了目前使用的HTML链接。XLink可以有多个链接终点,可以从不同的方向进行遍历,而且还可以将链接存储于独立于引用文档的数据库中。
4.XML文档定位的语言——XPath
XPath是用作XSLT和XPointer的对XML文档各部分进行定位的语言。它给XSLT和XPointer(XML文件内部链接语言)提供一个共同、整合的定位语法,用来定位XML文件中的各个部位。XPath除了提供一套定位语法之外,还包括一些函数,它们提供基本的数字运算、布尔运算和字符串处理功能。
XPath使用一个紧凑的、非XML的语法来方便实现XPath在XML属性值中的使用,它基于XML文档的逻辑结构,并在该结构中进行导航。除了用于定位,XPath自身还有一个子集能进行匹配,它能验证一个节点是否匹配某个模式。XPath把一个XML文档看成一个树或节点的模型。节点的类型可以有多种,包括元素节点、属性节点和文本节点。
XPath的基本语法由表达式构成。在计算表达式的值之后产生一个对象,这种对象有以下四种基本类型:节点集合、布尔型、数字型和字符串型。表达式的计算是依据上下文的出现,XSLT和XPointer中分别规定了XPath表达式将在怎样的情况下出现。这些上下文的关系包括:节点、一对正整数(表明位置和大小)、一套变量绑定集合、函数库以及规定表达式范围的名域声明。其中,变量绑定是从标量名称到变量值的映射;变量的值是一个对象,可以是表达式可能得到的各种类型,也可以是其他没有规定的类型;在函数库中,每个函数有零个或多个参数,并返回一个结果。XPath定义了所有支持工具都必须实现的核心函数库。其中函数的参数和结果都是上面涉及的四种基本类型。当然XSLT和XPointer还对XPath的核心函数库进行了扩展,有些函数的参数和返回结果数据类型超出了这四种基本类型。XPath基本上和在文件系统中寻找文件类似,如果路径是以“/”开头的,就表明该路径表示的是一个绝对路径,这和在UNIX系统中关于文件路径的定义是一致的。
5.XML内部结构部分的定位语言——XPointer
XPointer支持对XML的内部结构部分的定位。XML中支持两类链接:简单链接和扩展链接。
简单链接类似于HTML中的链接,扩展链接允许从某个链接跳转到任意其他链接。这种跳转实际上是从文档树型结构的某个部分转移到另一位置,这种转移基于不同的特性来实现,如元素类型、属性值、相对位置或字符的内容等。
实际上,扩展链接的概念就是可以链接的资源不单单只有一个,可以同时链接多个资源。被链接资源的显示由具体实现的应用程序来决定。XPointer还提供了对元素、字符串和其他部分的特定引用方法,XPath通过轴和谓词对XML文档中树型结构各部分进行选择。XPointer的思想也是如此。XPointer还可以表达多个这样的选择,而且依次在前面所选的结果中再次进行选择。
对XML文档进行标识的形式有三种:一种完整的XPointer定位形式以及两种简记形式。完整形式以一个大纲的名称开始,然后紧跟一个表达式,该表达式用括号括起。如果该大纲为XPointer,其表达式将根据与XPath兼容的方式来访问XML文档信息集合中的节点。
下面的示例表示了从文件的LINK元素到文件http://www.xlinksample.Com/xpointer.xml中根元素的链接,其中“xpointer(/child:*[position()=1])”就是用于定位的XPointer。
示例:
1.<LINK>
2.xmlns:xlink="http://www.w3.org/TR/1999/xlink"
3.xlink:type="simple"
4.xlink:href="http://www.xlinksample.com/xpointer.xml
5.#xpointer(/child:*[position()=1]>
6.</LINK>
XPath作为XPointer的基石提供了表达定位的语法。XPointer还在之上进行了扩展,XPath提供了对XML文档中的子节点集合进行定位的方法。XPath通过谓词对轴(所谓的轴就是指child,descendant,parent,ancestor等关键字,表明查询的范围)进行过滤是根据对节点或节点集的操作来定义的,而XPointer还需要指定另外意义上的文档节点。例如,要选择两个节点中的某一部分,而这两个节点可能处于文档中不同的子树中。为了实现这一点,XPointer把定位定义为XPath的广义节点。
6.XML处理、查询——XQuery,DOM,SAX
(1)XML数据查询语言——XQuery
XQuery构建在XPath规范之上。事实上,XQuery的一些特性已被公认为是非常基本的,且已合并入XPath2.0规范中,这个规范目前为W3C的XMLQuery和XSL工作组共同拥有。这意味着样式表创建者将很快就能利用像序列、量化和更强有力的类型控制这样的特性。同样,也已将条件表达式和迭代器添加到了XPath语言中,而在以前它们是XSL语言的一部分。这样就可以在样式表中编写更清晰的代码,并且为样式表创建者带来较少的麻烦。
尽管依照句法来说,它在数据操作上比XSL要好用得多(它还支持许多XSL不直接支持的操作),但是其底层的引擎还是必须读取每篇文档、解析它,然后使用查询语言对它操作。因此,对于已建立索引的文档资源库(即所谓的XSL“数据库”),XQuery是快速访问文档具体内容的更好的解决方案,但对于未建立索引的文档,它并不是一个好的解决方案。
XQuery包含一些用来访问资源库中多个文档的机制。这个文档函数允许以编程方式在同一个查询中访问多个文档。但是对于仍需要装入并解析每个文档的情况,要达到最佳性能,还需使用XML数据库或一些其他形式的索引模型。
XQuery适宜处理“混合”文档,即:同时包含叙述流和量化数据的文档。例如,一个医疗记录文档可能包含手术期间外科医生操作的描述,以及手术期间使用的药物、血和其他物品的数量。该文档不适合存储在关系型数据库中,XQuery能直接从该XML文档中抽取出量化信息。如果文档是纯数据,那么将该文档引入到关系型数据库中进行操作会更有意义。
(2)DOM
DOM是HTML和XSL文档的编程接口规范,与平台和语言无关,可以用各种语言在各种平台上实现。该模型定义了XML和HTML文档在内存中的逻辑结构,提供了访问、存取XML和HTML文档的方法。利用DOM规范,可以实现DOM文档和XML之间的相互转换,遍历、操纵相应的DOM文档的内容。要自由的操纵XML文件,就要用到DOM规范。
DOM文档中的逻辑结构可以用结点树的形式进行表述。通过对XML文件的解析处理,XML文件中的元素便转化为DOM文档中的节点对象。DOM的文档结点有Document,Element,Comment,Type等结点类型。每一个DOM文档必须有一个Document结点,并且为结点树的根节点,可以有子结点,或者叶子结点,如Text结点、Comment结点等。任何格式好的XML文件中的每一个元素均有DOM文档中的一个节点类型与之相对应。利用DOM接口将XML文件转化成DOM文档后,就可以自由的处理XML文件。
(3)SAX
与DOM比较而言,SAX是一种轻量型的方法。在处理DOM的时候,需要读入整个的XML文档,然后在内存中创建DOM树,生成DOM树上的每个结点对象。当文档比较小的时候,不会造成什么问题,但是一旦文档大起来,处理DOM就会变得相当费时费力。特别是对内存的需求,也将是成倍的增长,在某些应用中使用DOM很不合适,一个较好的替代解决方法就是SAX。
SAX在概念上与DOM完全不同,不同于DOM的文档驱动,是事件驱动的,也就是说,并不需要读入整个文档,而文档的读入过程也就是SAX的解析过程。所谓事件驱动,是指一种基于回调(callback)机制的程序运行方法。
7.XML的一般应用过程
要构建一个XML应用,一般分为以下四个步骤:
(1)选择或编写DTD和Schema
确定应用系统中哪些信息需求采用XML来表示。如果是比较简单的数据结构,而且是单个简单的应用,可以采用DTD来定义XML信息的结构;如果数据结构和应用关系复杂,建议采用Schema来定义XML信息的结构。需要确定下列因素:文档中有哪些标记、标记可以包含哪些其他标记、标记的数量和次序、标记可以有的属性以及这些属性可有的值。
(2)生成XML文档
将DTD或Schema想象成需要填写的一个模板。对于每个元素,从其所在的位置,如数据查询、全文检索或目录查询中取得数据,然后简单地将其放入模板中。当模板被填满后(所有必需的元素被填入而且文档是有效的),能将其发送给要使用文档的另外一方。
(3)解释XML文档
当接收或读取到XML文档需要处理的命令时,有两种API可以使用,即前面所介绍的DOM和SAX。DOM提供了标准的功能来操作文档中的元素。SAXAPI在解析文档过程中发生一定事件的时候会发生通知事件。在对其响应时,不作保存的数据将会被抛弃。如果文档非常大,推荐使用SAX而不是DOM,因为这样将节省很多内存,尤其在只需要一个大文档中的几个元素时。在另一方面,DOM所提供的丰富的标准功能在SAX中是没有的。
(4)显示XML文档