第八章XSL转换XML.ppt
《第八章XSL转换XML.ppt》由会员分享,可在线阅读,更多相关《第八章XSL转换XML.ppt(118页珍藏版)》请在三一办公上搜索。
1、第八章 XSL转换XML,第八章 XSL转换XML,8.1 概述 8.2 一个XSL文档的讨论 8.3 XSL样式表 8.4 模板规则 8.5 样式表设计,8.1 概述,本章讨论XML文档的另一种转换技术XSL(XML stylesheet language-XML样式表语言)。W3C在推出XML 1.0规范后,便开始开发符合XML规范要求的转换技术,这就是XSL。XSL包含两个部分:一个是XSLT(XSL Transformation),另一个是定义格式的XML词表。XSL定义一个XML文档的样式,这个定义用XSLT描写XML文档是如何转换成另一个使用格式化词表的XML文档的。,8.1 概述
2、,1999年11月16日,W3C发布了XSLT 1.0。在2001年12月20日发布了XSLT 2.0,之后相继推出7个修订版。XSLT2.0规范包含:样式表结构,数据模型,XSLT语言,模式,模版规则等内容。本书的XSLT以2.0规范作为蓝本进行讨,8.2 一个XSL文档的讨论,在例2.1中我们给出了一个XML文档,现在着手设计一个简单的XSL转换文档来进行转换,在后续的章节逐步深入展开讨论。例8.1 根据例2.1的XML文档,设计一个简单的XSL文件进行转换。图8.1 例2.1 XML文档的树型结构 分析:在例2.1的XML文档中根元素是booklist,在bookist下有若干个book
3、子元素,book下有name、author、press、pubdate、price五个子元素和一个属性isbn。文档的结构如图8.1示。用XSL格式化该XML文档,设计要求为:,8.2 一个XSL文档的讨论,为根元素建立容器,容纳其所有的子元素。每个book显示在屏幕的一个行区域。每个book的子元素显示成一个单元。我们可以为例2.1设计一个XSL(文件名:ch8-1.xsl):123 4 5 图书信息6 7 8 图书信息,8.2 一个XSL文档的讨论,9 10 11 12 13 14 16 15 17 18 19 20,8.2 一个XSL文档的讨论,程序说明:XSL程序是符合XML规范的文档
4、,所以,第1行是该文档为XML文档的声明。第2行的声明此文件是XSL的表单文件,其中的version声明该文档的版本号,xmlns:xsl属性给出此XSL表单文件的名称空间。该声明需要结束符关闭(20行)。3-19行是一个整体,用 定义一个模板,其中的属性match=“/”用来选择该模板从根元素开始构建一个容器。,8.2 一个XSL文档的讨论,4-18行,借助HTML来显示XML元素内容。9-15行使用了循环命令,其中的属性select用来筛选出显示的元素,这是一个XPath表达式。作用是组织循环,显示booklist下的所有book元素。10-14行使用取值命令取出个元素的值,其中的sele
5、ct用来筛选某个具体的元素值。为了显示成一行,使用HTML的段落标记元素来划分段落。每一个元素值后用顿号“、”分隔。当设计好上述的XSL文档后,在例2.1的第二行加上:,8.2 一个XSL文档的讨论,然后在浏览器上显示结果如图8.2所示。,图8.2 用ch8-1.xsl转换ch2-1.xml,8.2 一个XSL文档的讨论,1.什么是XSLT 以样式表(stylesheet)的形式来表示XML文档,把XML文档的元素用特定转换命令实现转换,这就是XSLT。在转换XML源文档时,XSLT的任务是把样式信息添加给一个XML源文件,并把它转换成包含XSL格式化对象的文档,如HTML、XHTML等。样式
6、表就是这个转换技术的核心之一。在XSLT中使用一种叫转换表达式的东西,来描述把源文档树转换成结果树的方法和语法规则。这个转换表达式的规则由XPath规范定义,有关XPath的内容请参考第5章。,8.2 一个XSL文档的讨论,文档树的结构用数据模型说明。转换由一组模版规则来实现。模版(template)把树的层次结构构成的元素序列与模式(pattern)相联系,模式与源文档的结点值匹配。许多情况下,计算这个元素序列会产生新结点作为结果树的一部分。结果树与源树的结构可能相同,也可能完全不同。在构造结果树的过程中,源树的结点可能被过滤掉或被重新排序,还可能加上其他任意结构。这个机制允许样式表能够应用
7、到各种用途的文档,这些文档具有类似源树结构的构造形态。一般情况下,样式表包含的元素可以是用XSLT定义的,也可以不是。当样式表包含的元素是用XSLT定义时,必须使,8.2 一个XSL文档的讨论,用XSLT的名称空间间来进行限定。XSLT的名称空间规定为:http:/www.w3.org/1999/XSL/Transform。例如,在例8.1中xsl文件的第2行,我们使用了这个URI,来规定在整个文件中的XSLT元素都使用XSLT的这个名称空间。2.样式表 样式表是用xsl:stylesheet元素或xsl:transform元素定义的一个整体,由一个以上的模块组成。每一个模块形成一个XML文档
8、的整体或某个部分。每个样式表模块的形成由数据模型中的一个元素结点来表现。样式表模块分为标准和简化两种。,8.2 一个XSL文档的讨论,3.模版规则 XSLT技术以“模板驱动”的方式访问XML数据,通过引进模板来访问XML数据元素及其属性。模版规则定义一个处理容器,这个处理能够用于匹配特定模式的结点。一个模版由一个带xsl:template声明来定义。一个xsl:template元素必须具有一个match或name属性,或两者都有。如果一个xsl:template元素带有match属性,它就是一个模版规则。如果一个xsl:template元素带有name属性,它就是命名模版。,8.2 一个XSL
9、文档的讨论,模版的引用有许多方法,这要根据它是模版规则、还是命名模版来决定。引用模版的结果就是计算包含在xsl:template元素中的序列构造的结果。,8.3.1 样式表元素,1.定义样式表 在XSL中,样式表元素用xsl:stylesheet 和xsl:transform来表示。xsl:stylesheet是一个表示样式表模块的XML元素,xsl:transform是xsl:stylesheet的同义词,所以说这两个元素是等价的。它们的语法格式的简化形式分别为:,8.3.1 样式表元素,如例8.1中的XSL文件中的第2行:就是一个样式表定义。这行代码告诉XSLT解析器现在执行的是一个XSL
10、转换样式表文件。2.样式表子元素 在一个样式表中,可以使用在xsl:stylesheet元素之下的子元素叫顶层元素。常用的顶层元素有:xsl:template、xsl:import、xsl:include、xsl:function、xsl:output、xsl:param、xsl:variable。,8.3.1 样式表元素,3.简化样式表模块 一个简化样式表是一个只包含文档结点的单个模版规则。这个样式表模块可以仅包含文字结果元素和它的内容。简化样式表规则使用匹配模式“/”。例8.2 使用简化样式表规则设计样式表。仍然用例8.1中使用的XML文档来讨论,下面是设计模块:,8.3.1 样式表元素,
11、图书信息新书:因为我们在此简化样式表中,没有使用循环指令,所以只能显示第一本书的名称。,8.3.1 样式表元素,其显示效果如图8.2。,作为一个简化样式表模块最外层元素的文字结果元素,必须具有xsl:version属性,用来指明XSLT的版本。这个版本值正常取2.0。,图8.3 一个简化样式表,8.3.1 样式表元素,4.向前和向后兼容处理 因为XSLT 1.0是1999年发布的,这个1.0版本存在许多弱点,如计算一个求和、平均值这样的问题,必须借助脚本语言来实现,计算功能很弱;格式化信息不丰富等。在后来的2.0版本中采取了废弃一些指令元素的办法,对1.0作了相当大的修改、完善,根本上改变了原
12、来1.0版本的面貌。现在讨论的几乎是一个全新XSLT版本。所谓的向前和向后兼容就是针对XSLT 2.0以前的版本设置的兼容技术,当一个元素的version属性值小于2.0时,我们说它具有向后兼容行为。当大于2.0时说它具有向前兼容行为。,8.3.1 样式表元素,向后兼容时处理器自动使用XSLT1.0来处理XSLT文档。向前兼容的处理器自动使用XSLT2.05.标准属性 为了说明标准属性,我们来参考xsl:styleshee元素的详细格式:,8.3.1 样式表元素,8.3.1 样式表元素,其中出现的属性extension-element-prefixes、exclude-result-prefi
13、xes、version、xpath-default-namespace、default-collation等,就是标准属性。这些标准属性可能出现在所有的XSLT 元素中。version、xpath-default-namespace、default-collation几种属性,其属性值可以被出现在后继元素中的相同属性覆盖。因为这些属性通常只用在xsl:stylesheet元素中,它们对整个样式表下的子模块都有效。8.XSLT的媒体类型 XSLT使用的媒体类型是:application/xslt+xml。,8.3.2 样式表名称空间,关于名称空间的讨论,在2.3节曾经详细讨论过。在XSLT引入名
14、称空间也是出于类似的考虑,因为XSLT技术是面向应用的,当出现许多不同应用具有相同元素和属性名称时,需要把它们分别开来,给应用程序提供分辨属于不同名称空间的元素和属性的可能,这在XSLT的应用中十分重要。XSLT处理器必须使用XML名称空间机制来识别元素和属性。来自XSLT名称空间的元素只在样式表中被识别,而不是在XML源文档中,它的名称空间与源XML的名称空间不能混淆。实现工具也不能扩展具有附加元素和属性的XSLT的名称空间。,8.3.2 样式表名称空间,1.保留名称空间 XSLT名称空间和其它被XSLT处理器识别的某些名称空间,称为保留名称空间,必须只能在XSLT中使用。这些保留的名称空间
15、是:XSLT名称空间:http:/www.w3.org/1999/XSL/Transform 标准函数名称空间:http:/www.w3.org/2005/02/xpath-functions 用来定义函数。XML名称空间:http:/www.w3.org/XML/1998/namespace用于xml:lang和 xml:space属性。,8.3.2 样式表名称空间,模式名称空间:http:/www.w3.org/2001/XMLSchema,用于定义XML 模式。在样式表中,这个名称空间用来引用内置的模式数据类型,以及用这些数据类型构造函数。Xpath数据类型名称空间:http:/www.
16、w3.org/2005/02/xpath-datatypes,用于定义函数和运算符。模式实例名称空间:http:/www.w3.org/2001/XMLSchema-instance,用于定义XML Schema。,8.3.2 样式表名称空间,2.名称空间前缀 名称空间前缀用来定义一个使用的元素与一个名称空间的关联,通常叫做绑定。如例8.1中第2行的xmlns:xsl=http:/www.w3.org/1999/XSL/Transform,就把XSLT的名称空间绑定给前缀xsl。当然XSLT可以使用任意字符串作为名称空间前缀,只要它绑定给规定的XSLT名称空间即可。,8.3.3 样式表模块组合
17、,当一个样式表中需要对若干个XML进行转换的XSL文件时,或对同一个XML需要多种样式表模块来转换时,可以使用包含机制和输入机制。包含机制不改变组合模块的语义来组合样式表模块。输入机制允许样式表彼此覆盖。在XSLT中,包含机制和输入机制用xsl:include和xsl:import来完成。1.样式表包含 包含一个样式表模块,可以使用xsl:include声明,格式为:,8.3.3 样式表模块组合,2.样式表导入 导入一个样式表模块,可以使用xsl:import声明,格式为:xsl:import声明与xsl:include一样,要求具有href属性,它的含义与xsl:include一样。这个元素
18、必须是顶层元素。xsl:import元素的孩子必须先于xsl:stylesheet元素的所有其它元素的孩子,包含任何的xsl:include元素孩子和任何的用户定义数据元素。,8.3.3 样式表模块组合,例8.3 使用xsl:import导入样式表模块。,8.4 模板规则8.4.1模板,1.定义模板 一个xsl:template声明定义一个模版,它包含创建结点和原子值的序列构造。模版既可以作为模版规则,用比照一个模式来匹配结点的方法构造规则,也可以是命名模版,用名称来明确指定。有时,一个模版可以同时具有这两种能力。模版定义的简化规则如下:,8.4.1 模板,说明:match属性标识模版是一个模
19、版规则。值为模式(pattern)类型。name属性标识模版是一个命名模版。priority属性定义属性的优先级。match属性值确定一个规则,用来决定模板所关联的结点类型。结点可以是一个文本元素、属性,可以是XML文档树的一个分支,还可以是与整个XML文档树。结点的这种划分叫做模式(pattern)。,8.4.1 模板,例8.4 设计包含简单元素的模板。下面是一个简单元素定义:Beijing 表示该元素的模版可以设计成:当指令xsl:apply-templates选择的结点与match属性确定的模式匹配时,执行该模版规则。,8.4.1 模板,2.应用模版 在例8.3中使用了应用模板xsl:a
20、pply-templates来处理xsl:template模板指定的元素。xsl:apply-templates指令输入一个结点序列,这个输入序列由xsl:template的matck属性决定;输出一个项目序列,该序列由xsl:apply-templates本身决定。这些项目通常是添加给结果树的结点。xsl:apply-templates的语法规则如下:,8.4.1 模板,说明:select属性用来筛选出结点,可以写,也可以不写。在xsl:apply-templates可以使用排序指令xsl:sort,输入的序列是排过序的。在xsl:apply-templates可以使用xsl:with-pa
21、ram解决参数使用问题。为了说明应用模板的使用,下面给出一个XML文档来讨论。例8.5 一个家电购买的XML文档。文档参考P.238。,8.4.1 模板,在这个XML文档中,根元素是e_appliance,在根元素下有三个子元素goods,每个goods下有两个并行的子元素,三个goods都有purchaser子元素,但另外一个元素各不相同。(1)后继元素引用方法 例8.6 在例8.5的XML文档中,引用purchaser后继name的应用模板设计方法。在select 中指明后继关系:,8.4.1 模板,从purchaser元素开始匹配,然后在select=“purchaser/name”,用
22、“/”指明name是在select 中没有后继关系:从purchaser元素开始匹配,然后在select=name没有用“/”指明name是purchaser的子元素。只有XML文档给出的隐含关系。这两种方法是等效的。,8.4.1 模板,(2)改变结果输出顺序 一般情况下,XSL文档按照XML文档的顺序输出转换结果。为了改变这种情况,可以在xsl:template中的加入多个xsl:apply-templates元素,可以改变结果内容的输出顺序。例8.7 对例8.5的结果树元素重新排列,让refrigerator比TV提前显示。,8.4.1 模板,(3)递归结构 当存在同名的后代时,可能出现两
23、个以上同时匹配的后代,其中一个又是另一个的后代。,这在网页设计中是经常使用的。此时,不做特殊处理,两个后代将分别按照常规处理。模版可以设计如下:该模版将处理外层table和内层table元素。,8.4.1 模板,(4)多模板并行 当出现上级元素调用子元素时,可以使用多个模板并行的办法来解决。例8.8 对purchaser元素下的name子元素使用多模板并行结构。姓名:第1个xsl:template通过xsl:apply-templates的select,8.4.1 模板,筛选出name子元素,第2个并行的xsl:template结构中直接使用来显示输出结果。例8.9 对purchaser下的后
24、继province子元素使用多模板并行结构。住址:,8.4.1 模板,因为province不是purchaser的直接孩子,所以使用3个并行的xsl:template结构。第1个通过xsl:apply-templates的select筛选出address子元素,第2个通过xsl:apply-templates的select筛选出province子元素,第3个直接使用来显示输出结果。例8.10 例8.5的XSL转换文档。综合上述讨论,把例8.5 XML文档的XSL转换程序设计成P.241的程序。为了方便说明,在XSL文档中加上了行号。程序说明:第1行是XML声明。,8.4.1 模板,第2行是名称
25、空间声明,在声明中必须说明version属性。第3-13行是主模板声明。9行声明模板匹配从源文档的purchaser元素开始。第14-22行声明purchaser元素的三个平级子元素。16行使用了xsl:number指令为项目编号。第23-25行的模板处理17行的模板。第28-28行的模板处理18行的模板第29-36行的模板处理19行的模板,分别声明address的各个子元素。第37-40处理 31行,41-43行处理32行,44-46行处理33行,44-46行处理33行,47-49行处理34行。,8.4.1 模板,此程序的显示结果如图8.4,图8.4 例8.10的XSL文档的显示结果,8.4
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第八 XSL 转换 XML

链接地址:https://www.31ppt.com/p-5302813.html