张银的博客


Eat to live, but do not live to eat.

导航

《XML基础教程与实验指导》 第5章 XSL转换XML文档

Posted on 2009-04-05 23:45  张银  阅读(840)  评论(0编辑  收藏  举报

第5章  XSL转换XML文档

  XML关于文档浏览的基本思想是将数据与数据的显示分别定义。这样一来,XML格式文档不会重蹈某些HTML文档结构混杂、内容繁乱的覆辙,XML的编写者也可以集中精力于数据本身,而不受显示方式的细枝末节的影响。定义不同的样式表可以使相同的数据呈现出不同的显示外观,从而适合于不同应用,甚至能够在不同的显示设备上显示。这样,XML数据就可以得到最大程度上的重用性,满足不同的应用需求。XML数据的显示可以采用CSS和XSL样式文件实现。

本章知识要点:
掌握XSL的基本概念
熟练掌握XSL转换原理
掌握XSL文档创建和使用
了解CSS和XSL的区别
掌握XSL模板规则和调用
熟练掌握不同的方式选择节点
掌握XSL常见的控制指令
熟练掌握XSL与CSS的结合使用

5.1  XSL介绍

  XSL是专门针对于XML文档的样式提出来的一种规则,使XML文档得到更加有效的表现形式,XSL文档实际上是XML文档的一种延伸,是依据XML制成的样式语言。通过XSL文档可以对XML进行样式设置、计算、整理和排序等,XSL比CSS要复杂的多。

5.1.1  XSL概念

  XSL是为XML的样式显示设计的语言,该语言定义一系列的元素集的XML的语法规范,该语法规定可把XML文件转换成HTML、XML或其他的文档。一个XSL的样式表单里面包含的是多个设计规则,显示方式,从XML文档中提出来的数据依据这个样式表单规定显示方式显示,形成一个新的文档。这种转换采用公开的方式,使其更加容易、方便的程序员使用。XSL还提供多种脚本语言的通道,可以满足语言对其的操作,以满足更为复杂的应用需求。XSL是一种新的标记语言,它的可扩展性,使得它可以控制出现的标记。

5.1.2  XSL转换原理

  XSL工作原理就是把XML文档作为一个存储数据的树来看待,称它为源树。XML文档的根元素和子元素可以看作是树节点。XSL就是把这些存放数据根据我们自己的需要从XML树中提去出来,组成一个新的树,也就是结果树。结果树和源树是独立存在的,对结果树中的数据操作不会影响到源树中的数据,XSL正是通过这种方式实现了数据和表示分离的目的。而XSL提取数据的工具就是XSL处理器,XSL处理器首先根据要找的节点在源树中寻找,其寻找方式就是上面描述的情形。数据提取到之后,就到XSL文档中,找到与这个节点匹配的样式定义。按定义好的样式显示数据,即形成了一个新的文档树。

5.1.3  XSL文档创建与应用

  XSL是基于XML的语言,即XSL文件是一种格式良好的XMI文件,因此它和XML文件在语法上是一致的。事实上,由于XML是元语言,所以它具备描述其他语言的能力,或者说它可以通过XML来制定另一种语言。XSL就是用XML来描述的一种使用于定义样式的语言,并且XSL所定义的样式专门用于XML文档。因此,所有的XSL文件都应该是格式良好的XML文件,只不过XSL文件的扩展名是“xsl”,而不再是“xml”。

5.1.4  XSL与CSS比较

  XSL可以非常容易的操作。XSL采用了和CSS文档处理样式的不同方法。它能将一种格式XML文档转换成另外一种,可以满足服务器针对不同的用户显示不同的样式。XSL的另外一个特点就是支持中文,在CSS的编写中,CSS不支持中文。这对于喜欢使用中文的用户,是更有理由使用XSL。而XSL虽然功能强大,学习和理解起来比较难,并且因为要重新索引xml(标准化越来越近了)结构树,所以消耗内存比较多。

5.2  XSL模板

  XSL样式表单是由一个或多个被称为“模板”的规则集组成的。每个模板都包含了与每一个指定节点相匹配的应用规则。模板规则包含两个部分:模式(pattern)和模板(template)。模式用于在源文档中匹配(定位)节点,模板定义节点的处理规则,通过模板的实例化来组成结果树的一部分。

5.2.1  XSL模板规则

  XSL样式表单的扩展名是“.xsl”的文本文件,和XML文档类型,XSL样式表单的内容也是有标记及其内容组成,只不过按照W3C规范,这些标记都有着特殊的意义,以便XSL处理器可以处理它们。XSL样式表单遵守和XML一样的语法要求,它必须是规范的。
XSL样式表单的目的是为和其关联的XML文件提供数据显示的外观,这样,XSL样式表单中的标记就经常要和XML文件中的标记发生联系,为了不引起混乱,我们将XSL样式表单中的标记称为XSL标记,将XML文件中的标记称为XML标记。

5.2.2  XSL模板调用

  <xsl:apply-templates>元素用于告诉XSL处理器处理当前节点的所有子节点。在转换XML文档时,往往需要递归处理文档树中每一个节点,可以使用<xsl:apply-templates>完成这个操作。在模板规则的模板中使用<xsl:apply-templates>元素,告诉XSL处理器将匹配的节点每一个节点(包括文本节点)与样式表中的模式规则进行比较,如果找到了匹配的模板规则,那么就可以为匹配的节点输出模板。当然了,在匹配的节点模板中还可以再包含<xsl: apply-templates>元素,从而通知处理器处理该节点的所有子节点,这样依次调用,就可以完成对文档树中所有节点处理。

5.3  XSL节点选择

  “标记匹配模式”就是描述该模板适用于那个标记,也可能有多个标记。“标记匹配模式”就是满足一定条件的一组XML标记,其中每个XML标记都称作匹配模式的XML标记。实际上“标记匹配模式”就是告诉模板如何在XML文档中选择节点。

5.3.1  使用元素名选择节点

  在XML文档中,根标记的子标记是很重要的类别,XSL应该能为这类XML标记设定显示的样式,即相匹配的模板。这些模板中的“标记匹配模式”(XML标记的路径信息)可以是子标记的名字或根标记的名字。XSL处理器会根据match属性提供元素名称,去XML文档中提取该节点的数据。

5.3.2  使用路径选择节点

  上一个小节中,我们直接通过了元素名称匹配了模板,实际上也可以通过详细的路径信息选择节点。即模板中的“标记匹配模式”(XML标记的路径信息)可以有子标记名称、根标记名称、斜杠(/)或双斜杠(//)共同组成。

5.3.3  使用匹配符选择节点

  对于不同的标记,路径写法也不完全相同,其路径信息中可以包含相应的匹配符。通过使用匹配符“*”可以建立匹配任何标记的模板,无论该标记是根标记的几级子标记。例如,“<xsl:template match="*">”表示匹配任何元素,“<xsl:template match="员工列表/*/*">”表示匹配【员工列表】元素节点的任意子节点的子节点。

5.3.4  使用元素属性选择节点

  通过使用“标记[@属性 ]”或“标记[@属性=‘属性值’]”,可以建立匹配具有指定属性的标记的模板。起到一个筛选的作用,若只需要为某个带有属性的标记创建模板,该模板的标记匹配模式可以通过上面的形式指定。

5.3.5  使用附加条件选择节点

  可以使用“[]”来给出一个标记需满足的条件,即可以更精确的匹配某一个节点。例如<xsl:template match=“//goods[price]”>模板的内容</xsl:template>。标记匹配模式后的路径信息表明该模板是名字为goods且具有子标记price的标记的匹配模板。使用“|”给出几个可以选择的标记,例如<xsl:template match=“//单价|库存量|生产日期”></xsl:template>表明该模板是标记名字为“单价”,“库存量”和“生产日期”等标记的匹配模板,无论这些标记在根标记的哪一级子标记。

5.4  XSL控制指令

  XSL文件实质上是XML文档,有HTML和XSL标记组成,只不过这些标记能够被XSL处理识别。XSL标记对输出的数据进行筛选和判断,从而达到过滤数据的目的。

5.4.1  简单判断指令

  script表示是否使用脚本程序;language表示脚本程序使用的语言的种类;test属性是该标记最重要的属性,用来设置标记过滤的条件。只有当test设置的条件成立的时候,XSL处理器才会执行<xsl:if>标记下面的指令,当条件不满足的时候,不执行下面的指令。

5.4.2  多条件判断指令

  在<xsl:if>元素只有两种选择,而如何要有多种选择单靠一个<xsl:if>元素就不能胜任了,<xsl:choose>就是在多种条件中进行判断选择的。<xsl:choose>包含了一组<xsl: when>元素,在test中属性中将规定各种条件,在测试时将从顶至底依次匹配直到找到满足的条件。如果所有的<xsl:when> 元素都不满足要求,则应用<xsl:otherwise>元素。

5.4.3  循环处理指令

  <xsl:for-each  select=“标记匹配模式”>内容</xsl:for-each>标记主要用来获得指定XML文档中某个标记,并将定义的样式作用在该标记的上面。当XML文件中出现了两条以上名字相同的标记所定义的数据时,我们必须先用<xsl:for-each select= ""></xsl:for-each>指定同名标记后,才能通过<xsl:value-of select= ""><xsl:value-of>来提取各个同名的标记。该标记在XSL文件中可以多次的使用。

5.4.4  输出内容的排序

  <xsl:sort> 总是作为元素<xsl:apply-templates> 或元素<xsl:for-each> 的子元素,包括select、lang、data-type、order、case-order等几个可选属性。在XSLT中可以对XML源文档的元素进行重新排序,排序的语法就是xsl:sort。

5.5  XSL应用实例

  XML文件的所有表现信息多发放在了XSL样式表单文件当中。XSL文件全权负责XML源文件的表现形式。所以说如果一个XML源文件对应不同的样式表单文件它就会有不同的表现形式。有了XSL文件我们可以对文件表现型始终的大小,颜色,空白作特定的规定。如果将XML文件转换为HTML文件,XSL文件显示XML数据所使用的标记,通常是HTML标记。HTML标记作为布局和显示内容是一个最佳的选择,但作为样式修饰就远远不如CSS强大了。在XSL样式表单中加入CSS代码,是显示XML数据另外一种方法。

 

welcome.xsl
welcome
employees
employees.xsl
employees1.xsl
employees2.xsl
employees3.xsl
employees4.xsl
employees5.xsl
example1
example2
example2.xsl
example2_0.xsl
example3
example3.xsl
example4
example4.xsl
example5
example5.xsl
example6
example6.xsl
example7
example7.xsl
example8.xsl
example8
example9
example9.xsl
example9_1.xsl
example9_2.xsl
example9_3.xsl