《第八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文档是如何转
2、转 换换成另一个使用格式化词词表的XML文档的。 8.1 概述 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文档,设计设计 一
3、个简单简单 的XSL文 件进进行转换转换 。 图图8.1 例2.1 XML文档的树树型结结构 分析:在例2.1的XML文档中根元素是booklist,在 bookist下有若干个book子元素,book下有name、author、 press、pubdate、price五个子元素和一个属性isbn。文档的 结结构如图图8.1示。用XSL格式化该该XML文档,设计设计 要求为为: 8.2 一个XSL文档的讨论 为为根元素建立容器,容纳纳其所有的子元素。 每个book显显示在屏幕的一个行区域。 每个book的子元素显显示成一个单单元。 我们们可以为为例2.1设计设计 一个XSL(文件名:ch8-
4、1.xsl): 1 2 3 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规规范的文档,所以,第1行是该该文 档为为XML文档的声明。 第2行的声明此文件是XSL的表单单 文件,其中的version声明该该文档的版本号,xmlns:xsl属性 给给出此XSL表单单文件的名称空间间。该该声明需要结结束符 关闭闭(20行)。 3-19行是一个整体,用 定义义一个模板,其中的属性match=“/”用 来选择该选择该 模板从根元素开
5、始构建一个容器。 8.2 一个XSL文档的讨论 4-18行,借助HTML来显显示XML元素内容。 9-15行使用了循环环命令,其中的属 性select用来筛选筛选 出显显示的元素,这这是一个XPath表达式。 作用是组织组织 循环环,显显示booklist下的所有book元素。 10-14行使用取值值命令取出个元素的 值值,其中的select用来筛选筛选 某个具体的元素值值。为为了显显示 成一行,使用HTML的段落标记标记 元素来划分段落。每 一个元素值值后用顿顿号“、”分隔。 当设计设计 好上述的XSL文档后,在例2.1的第二行加上: 8.2 一个XSL文档的讨论 然后在浏览浏览 器上显显示
6、结结果如图图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等。样样式表就是这这个转换转换 技术术的核心之 一。 在XSLT中使用一种叫转换转换 表达式的东东西,来描述 把源文档树转换树转换 成结结果树树的方法和语语法规则
7、规则 。这这个转换转换 表 达式的规则规则 由XPath规规范定义义,有关XPath的内容请请参考第5 章。 8.2 一个XSL文档的讨论 文档树树的结结构用数据模型说说明。转换转换 由一组组模版 规则规则 来实现实现 。模版(template)把树树的层层次结结构构成的元素 序列与模式(pattern)相联联系,模式与源文档的结结点值值匹 配。许许多情况下,计计算这这个元素序列会产产生新结结点作为结为结 果树树的一部分。结结果树树与源树树的结结构可能相同,也可能完全 不同。在构造结结果树树的过过程中,源树树的结结点可能被过滤过滤 掉 或被重新排序,还还可能加上其他任意结结构。这这个机制允许样
8、许样 式表能够应够应 用到各种用途的文档,这这些文档具有类类似源树树 结结构的构造形态态。 一般情况下,样样式表包含的元素可以是用XSLT定义义 的,也可以不是。当样样式表包含的元素是用XSLT定义时义时 ,必 须须使 8.2 一个XSL文档的讨论 用XSLT的名称空间间间间 来进进行限定。XSLT的名称空间规间规 定为为:http:/www.w3.org/1999/XSL/Transform。例如,在 例8.1中xsl文件的第2行,我们们使用了这这个URI,来规规定在整 个文件中的XSLT元素都使用XSLT的这这个名称空间间。 2. 样样式表 样样式表是用xsl:stylesheet元素或x
9、sl:transform 元素定义义的一个整体,由一个以上的模块组块组 成。每一个模块块 形成一个XML文档的整体或某个部分。每个样样式表模块块的形 成由数据模型中的一个元素结结点来表现现。 样样式表模块块分为标为标 准和简简化两种。 8.2 一个XSL文档的讨论 3. 模版规则规则 XSLT技术术以“模板驱动驱动 ”的方式访问访问 XML数据,通 过过引进进模板来访问访问 XML数据元素及其属性。 模版规则规则 定义义一个处处理容器,这这个处处理能够够用于 匹配特定模式的结结点。一个模版由一个带带xsl:template声明 来定义义。一个xsl:template元素必须须具有一个match
10、或name属 性,或两者都有。如果一个xsl:template元素带带有match属性 ,它就是一个模版规则规则 。如果一个xsl:template元素带带有 name属性,它就是命名模版。 8.2 一个XSL文档的讨论 模版的引用有许许多方法,这这要根据它是模版 规则规则 、还还是命名模版来决定。引用模版的结结果就是计计 算包含在xsl:template元素中的序列构造的结结果。 8.3.1 样样式表元素 1. 定义样义样 式表 在XSL中,样样式表元素用xsl:stylesheet 和 xsl:transform来表示。xsl:stylesheet是一个表示样样式表 模块块的XML元素,x
11、sl:transform是xsl:stylesheet的同义词义词 ,所以说这说这 两个元素是等价的。它们们的语语法格式的简简化形式 分别为别为 : 8.3.1 样样式表元素 如例8.1中的XSL文件中的第2行: 就是一个样样式表定义义。这这行代码码告诉诉XSLT解析器现现在 执执行的是一个XSL转换样转换样 式表文件。 2. 样样式表子元素 在一个样样式表中,可以使用在xsl:stylesheet元素 之下的子元素叫顶层顶层 元素。常用的顶层顶层 元素有: xsl:template、xsl:import、xsl:include、xsl:function、 xsl:output、xsl:par
12、am、xsl:variable。 8.3.1 样样式表元素 3. 简简化样样式表模块块 一个简简化样样式表是一个只包含文档结结点的单单个模 版规则规则 。这这个样样式表模块块可以仅仅包含文字结结果元素和它的 内容。简简化样样式表规则规则 使用匹配模式“/”。 例8.2 使用简简化样样式表规则规则 设计样设计样 式表。 仍然用例8.1中使用的XML文档来讨论讨论 ,下面是设设 计计模块块: 8.3.1 样样式表元素 图书图书 信息 新书书: 因为为我们们在此简简化样样式表中,没有使用循环环指令 ,所以只能显显示第一本书书的名称。 8.3.1 样样式表元素 其显显示效果如图图8.2。 作为为一个简
13、简化样样式表模块块最外层层元素的文 字结结果元素,必须须具有xsl:version属性,用 来指明XSLT的版本。这这个版本值值正常取2.0。 图8.3 一个简化样式表 8.3.1 样样式表元素 4.向前和向后兼容处理 因为XSLT 1.0是1999年发布的,这个1.0版本存在 许多弱点,如计算一个求和、平均值这样的问题,必须借助 脚本语言来实现,计算功能很弱;格式化信息不丰富等。在 后来的2.0版本中采取了废弃一些指令元素的办法,对1.0作 了相当大的修改、完善,根本上改变了原来1.0版本的面貌。 现现在讨论讨论 的几乎是一个全新XSLT版本。所谓谓的向前和向后兼 容就是针对针对 XSLT
14、2.0以前的版本设设置的兼容技术术,当一个元 素的version属性值值小于2.0时时,我们说们说 它具有向后兼容行为为 。当大于2.0时说时说 它具有向前兼容行为为。 8.3.1 样样式表元素 向后兼容时处时处 理器自动动使用XSLT1.0来处处理XSLT文 档。向前兼容的处处理器自动动使用XSLT2.0 5.标准属性 为为了说说明标标准属性,我们们来参考xsl:styleshee元 素的详细详细 格式: 8.3.1 样样式表元素 8.3.1 样样式表元素 其中出现现的属性extension-element-prefixes、 exclude-result-prefixes、version、
15、xpath-default- namespace、default-collation等,就是标标准属性。这这些标标 准属性可能出现现在所有的XSLT 元素中。version、xpath- default-namespace、default-collation几种属性,其属性 值值可以被出现现在后继继元素中的相同属性覆盖。 因为这为这 些属性通常只用在xsl:stylesheet元素中, 它们对们对 整个样样式表下的子模块块都有效。 8.XSLT的媒体类类型 XSLT使用的媒体类类型是: application/xslt+xml 。 8.3.2 样样式表名称空间间 关于名称空间间的讨论讨论 ,在
16、2.3节节曾经详细讨论过经详细讨论过 。在 XSLT引入名称空间间也是出于类类似的考虑虑,因为为XSLT技术术是面 向应应用的,当出现许现许 多不同应应用具有相同元素和属性名称时时 ,需要把它们们分别别开来,给应给应 用程序提供分辨属于不同名称 空间间的元素和属性的可能,这这在XSLT的应应用中十分重要。 XSLT处处理器必须须使用XML名称空间间机制来识识别别元素和属 性。来自XSLT名称空间间的元素只在样样式表中被识别识别 ,而不是 在XML源文档中,它的名称空间间与源XML的名称空间间不能混淆 。实现实现 工具也不能扩扩展具有附加元素和属性的XSLT的名称空 间间。 8.3.2 样样式表
17、名称空间间 1.保留名称空间间 XSLT名称空间间和其它被XSLT处处理器识别识别 的某些名称 空间间,称为为保留名称空间间,必须须只能在XSLT中使用。这这些保 留的名称空间间是: 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
18、:/www.w3.org/2001/XMLSchema,用于定义义XML 模式。在样样 式表中,这这个名称空间间用来引用内置的模式数据类类型,以及 用这这些数据类类型构造函数。 Xpath数据类类型名称空间间: http:/www.w3.org/2005/02/xpath-datatypes ,用于定义义函数和 运算符。 模式实实例名称空间间: http:/www.w3.org/2001/XMLSchema-instance,用于定义义XML Schema。 8.3.2 样样式表名称空间间 2. 名称空间间前缀缀 名称空间间前缀缀用来定义义一个使用的元素与一个名称 空间间的关联联,通常叫做绑绑
19、定。如例8.1中第2行的 xmlns:xsl=“http:/www.w3.org/1999/XSL/Transform“,就把XSLT的名称空间间 绑绑定给给前缀缀xsl。当然XSLT可以使用任意字符串作为为名称空 间间前缀缀,只要它绑绑定给规给规 定的XSLT名称空间间即可。 8.3.3 样样式表模块组块组 合 当一个样样式表中需要对对若干个XML进进行转换转换 的XSL 文件时时,或对对同一个XML需要多种样样式表模块块来转换时转换时 ,可 以使用包含机制和输输入机制。包含机制不改变组变组 合模块块的语语 义义来组组合样样式表模块块。输输入机制允许样许样 式表彼此覆盖。在 XSLT中,包含
20、机制和输输入机制用xsl:include和xsl:import 来完成。 1. 样样式表包含 包含一个样样式表模块块,可以使用xsl:include声明 ,格式为为: 8.3.3 样样式表模块组块组 合 2.样样式表导导入 导导入一个样样式表模块块,可以使用xsl:import声明, 格式为为: xsl:import声明与xsl:include一样样,要求具有 href属性,它的含义义与xsl:include一样样。这这个元素必须须是 顶层顶层 元素。xsl:import元素的孩子必须须先于xsl:stylesheet 元素的所有其它元素的孩子,包含任何的xsl:include元素孩 子和任何
21、的用户户定义义数据元素。 8.3.3 样样式表模块组块组 合 例8.3 使用xsl:import导导入样样式表模块块。 8.4 模板规则 8.4.1模板 1. 定义义模板 一个xsl:template声明定义义一个模版,它包含创创 建结结点和原子值值的序列构造。 模版既可以作为为模版规则规则 , 用比照一个模式来匹配结结点的方法构造规则规则 ,也可以是命名 模版,用名称来明确指定。有时时,一个模版可以同时时具有这这 两种能力。 模版定义义的简简化规则规则 如下: 8.4.1 模板 说说明: match属性标识标识 模版是一个模版规则规则 。值为值为 模式( pattern)类类型。 name属
22、性标识标识 模版是一个命名模版。 priority属性定义义属性的优优先级级。 match属性值值确定一个规则规则 ,用来决定模板所关联联的结结 点类类型。结结点可以是一个文本元素、属性,可以是XML文档 树树的一个分支,还还可以是与整个XML文档树树。结结点的这这种划 分叫做模式(pattern)。 8.4.1 模板 例8.4 设计设计 包含简单简单 元素的模板。 下面是一个简单简单 元素定义义: Beijing 表示该该元素的模版可以设计设计 成: 当指令xsl:apply-templates选择选择 的结结点与match属性 确定的模式匹配时时,执执行该该模版规则规则 。 8.4.1 模
23、板 2.应应用模版 在例8.3中使用了应应用模板xsl:apply-templates来 处处理xsl:template模板指定的元素。xsl:apply-templates 指令输输入一个结结点序列,这这个输输入序列由xsl:template的 matck属性决定;输输出一个项项目序列,该该序列由xsl:apply- templates本身决定。这这些项项目通常是添加给结给结 果树树的结结点 。 xsl:apply-templates的语语法规则规则 如下: 8.4.1 模板 说说明: select属性用来筛选筛选 出结结点,可以写,也可以不 写。 在xsl:apply-templates可
24、以使用排序指令xsl:sort ,输输入的序列是排过过序的。 在xsl:apply-templates可以使用xsl:with-param解 决参数使用问题问题 。 为为了说说明应应用模板的使用,下面给给出一个XML文档来讨讨 论论。 例8.5 一个家电购买电购买 的XML文档。 文档参考P.238。 8.4.1 模板 在这这个XML文档中,根元素是e_appliance,在根元 素下有三个子元素goods,每个goods下有两个并行的子元素 ,三个goods都有purchaser子元素,但另外一个元素各不相 同。 (1)后继元素引用方法 例8.6 在例8.5的XML文档中,引用purchas
25、er后继 name的应用模板设计方法。 在select 中指明后继关系: 8.4.1 模板 从purchaser元素开始匹配,然后在 select=“purchaser/name”,用“/”指明name是 在select 中没有后继继关系: 从purchaser元素开始匹配,然后在select=“name“没有 用“/”指明name是purchaser的子元素。只有XML文档给给出 的隐隐含关系。这这两种方法是等效的。 8.4.1 模板 (2)改变结变结 果输输出顺顺序 一般情况下,XSL文档按照XML文档的顺顺序输输出转转 换结换结 果。为为了改变这变这 种情况,可以在xsl:templat
26、e中的加入 多个xsl:apply-templates元素,可以改变结变结 果内容的输输出 顺顺序。 例8.7 对对例8.5的结结果树树元素重新排列,让让 refrigerator比TV提前显显示。 8.4.1 模板 (3)递归结递归结 构 当存在同名的后代时时,可能出现现两个以上同时时匹配 的后代,其中一个又是另一个的后代。 ,这这在网页设计页设计 中是经经常使用的。此时时,不做特殊处处理,两 个后代将分别别按照常规处规处 理。模版可以设计设计 如下: 该该模版将处处理外层层table和内层层table元素。 8.4.1 模板 (4)多模板并行 当出现现上级级元素调调用子元素时时,可以使用多
27、个模板 并行的办办法来解决。 例8.8 对对purchaser元素下的name子元素使用多模 板并行结结构。 姓名: 第1个xsl:template通过过xsl:apply-templates的 select 8.4.1 模板 筛选筛选 出name子元素,第2个并行的xsl:template结结构中 直接使用来显显示输输出结结果。 例8.9 对对purchaser下的后继继province子元素使用 多模板并行结结构。 住址: 8.4.1 模板 因为为province不是purchaser的直接孩子,所以使用3个 并行的xsl:template结结构。第1个通过过xsl:apply-templ
28、ates 的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行是名称空间间声明,在声明中必须说须说 明version属 性。 第3-13行是主模板声明。9行声明模板匹配从源文档的 purchaser元素开始。
29、第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.1 模板 如果要求把家电电名称也显显示出来,可以修改9行的为为: 然后修改1
30、4行到22行,使之能分别处别处 理各种家电电 的主要属性的显显示问题问题 ,如: 8.4.1 模板 为为了设计设计 的方便,上面的XSL已经经把源XML文档的TV 、microwavestove、refrigerator改写成同一个元素名good ,然后处处理。当然,不改也行,这样这样 XSL转换转换 文档要复杂杂一 些。经过经过 修改后的结结果可以显显示成图图8.5,读读者可以参考本 节节内容自行设计这设计这 个XSL文档。 图8.5 8.4.1 模板 3. 优优先等级级 当源文档的一个结结点可能与几个模版规则规则 匹配时时, 该该怎样样解决究竟选择谁选择谁 的问题问题 ,这这称为为匹配焦点
31、。此时时, 只有一个模版计计算给这给这 个结结点。为为了解决选择谁选择谁 匹配谁问谁问 题题,XSLT中引入了模板的优优先级级(priority)。优优先级级如表 8.1所示。匹配的步骤为骤为 : 首先,只考虑虑匹配的模版规则规则 具备备最高的输输入 优优先。忽略较较低优优先的模版。 其次,在剩下的匹配规则规则 中,只有那些具有最高 优优先级级的被考虑虑,模版的优优先级级用属性priority 定义义。如 果没有 8.4.1 模板 如果没有priority属性,根据match提供的模式的 语语法计计算默认值认值 。如果模式包含多个选项选项 ,每个选项选项 用 “|”分隔,每个选项选项 是等价的
32、。一次会选择选择 一个选项选项 。 Priority的值值根据不同的形式选择选择 不同的值值, 取值值情况参考表8.1。 格式Priority说说明 element()0.5 与*等价 element(*)0.5 与*等价 attribute()0.5 与*等价 attribute(*)0.5 与*等价 element(E)0与E等价 element(*,T)0只匹配类类型 attribute(A)0 与A等价 8.4.1 模板 表8.1 Priority (续续) 格式Priority说说明 attribute(*,T)0只匹配类类型 element(E,T)0.25匹配名称与类类型 sch
33、ema-element(E)0.25匹配替换组换组 和类类型 attribute(A,T)0.25匹配名称和类类型 schema- attribute(A) 0.25匹配名称和类类型 8.4.2 模式 模板规则标识规则标识 的结结点用模式来给给出应应用规则规则 。模 式用来计计数、分组组等。模式是结结点上的一组组条件。满满足这这 些条件的结结点与这这个模式匹配,否则则不匹配。如果从一个相 关的模式表达式的导导出结结果中选选中了一个结结点,就称这这个 结结点匹配该该模式。 1.常用模式 在XSLT中常用到一些模式,下面是这这些模式的列表 。 8.4.2 模式 表8.2 XSLT的常用模式 8.4
34、.2 模式 8.4.2 模式 2. 模式语语法 模式是一组组用“|”分隔开来的路径表达式,路径 表达式中的每一步约约束成只使用孩子和属性轴轴的轴轴步骤骤。模 式还还使用/操作符。 模式能以一个id或key函数调调用开始。假如要匹配 的值值有字面值值,或对对一个变变量或参数引用,且key函数的关 键键名字是一串文字。这类这类 模式不会匹配根元素不是文档结结点 的树树。 如果一个模式出现现在可以使用向后兼容行为为的样样 式表的一部分中,则该则该 模式的语义语义 以等价的Xpath表达式为为 基础础来定义义。 8.4.2 模式 例8.10中的几个模式使用: 匹 配根元素 匹配purchaser 匹配
35、purchaser 应应用模板 例8.11 匹配属性结结点。 在例2.1中,book元素附属一个属性结结点isbn,在XSL程 序中可以用匹配属性的方法来选择结选择结 点。在例8.1的XSL程序 的14行前插入一行, book的isbn属性就会像元素结结点一样显样显 示。 8.4.3 序列构造 在计计算样样式表的结结点组组成时时,需要用一种规则规则 来计计算 并返回结结果序列,这这叫序列构造。在XSLT中序列会处处理四类类 结结点:文本结结点、无父元素的结结点、数据项项和扩扩展指令。序 列构造所产产生的结结果序列的方法根据不同的指令而各不相同 。 文本结结点:出现现在样样式表中,在结结果序列中
36、被复制来 创创建新的无父亲亲的文本结结点。 无父元素的结结点:用文字结结果元素的计计算来创创建。与 文字结结果元素有相同的名字,被添加到结结果序列中。 数据项项:XSLT指令产产生零个、一个或多个数据项项的序 列作为为自己的结结果。 8.4.3 序列构造 扩扩展指令也产产生一个数据项项序列作为为自身的值值,该该序 列中数据项项内添加到结结果序列中。 1.构建复杂杂内容 所谓谓复杂杂内容是指内容模型包含子元素、属性、名 称空间间等的类类型。如何通过计过计 算序列构造得到的序列来创创建 新构造的文档结结点的孩子,或是新建立的元素结结点的孩子、 属性和名称空间间? 在XSLT中,通过过xsl:cop
37、y, xsl:element, xsl:document, xsl:result-document,或文字结结果元素产产生 序列构造,然后计计算该该序列构造来得到数据项项序列。 8.4.3 序列构造 2. 构建简单简单 内容 一个指令创创建的内容不包含子元素,这这称为简单为简单 内容构建。在XSLT中, xsl:attribute、xsl:comment、 xsl:processing-instruction、xsl:namespace和xsl:value-of 等指 令用于简单简单 内容的创创建。其中,xsl:attribute创创建属性结结点 、xsl:comment创创建注释结释结 点、
38、xsl:processing-instruction创创建 处处理指令结结点、 xsl:namespace建立名称空间结间结 点、 xsl:value-of 建立文本结结点。新结结点的串值值用指令的 select属性来建造。select属性的内容用XPath表达式来确定 。select属性和序列构造被计计算后产产生结结果序列,新结结点的 串值值从这这个结结果序列中导导出。 8.4.3 序列构造 计计算时时,序列中的零长长度的文本结结点被遗遗弃。相 邻邻的文本结结点连连接成单单个文本结结点。结结果序列中的几个串 用空格分隔符分隔后连连接起来。从这这个连连接产产生的串形成 新结结点、名称空间间、注
39、释释、处处理指令,或文本结结点的串值值 。 3.创创建文本结结点 本节讨论节讨论 文本结结点创创建的指令及其用法。它们们是 :xsl:text和xsl:value-of。 一个序列构造可能包含文本结结点。在处处理完空格 后,序列构造中保留下来的每个文本结结点将建造一个新的具 有相同串值值的文本结结点,得到的文本结结点附加到包含序列构 造的结结果上。 8.4.3 序列构造 1)xsl:text xsl:text用于建造新的文本结结点,语语法为为: xsl:text的内容是一个单单文本结结点,它的值值构成新文 本结结点的串值值。一个 xsl:text 可以为为空,此时计时计 算这这个 指令得到的结
40、结果是长长度为为零的文本结结点。 8.4.3 序列构造 (2)xsl:value-of 在XSLT中,xsl:value-of是一个常用指令。指令格 式为为: 计计算xsl:value-of来建造一个新的文本结结点。该该指令 的结结果产产生新建造的文本结结点。新文本结结点的串值值可以用 select属性定义义。 例8.12 行的指令产产生的结结果: 1|2|3|4 8.4.3 序列构造 根据元素来选择选择 ,此时时select表达式是元素名称 ,下例中元素名为为name: 如果要选择选择 元素的属性,可以在select表达式中使 用来选择选择 ,下例中属性名是name。 8.4.4 循环 在X
41、ML中,有的数据以结结构化形式出现现,可以转换转换 成相 应应的表格。要产产生表格中重复的行结结构,就需要从XML文档 树树中取出所有的结结点信息,对对于重复数据,使用循环结环结 构来 遍历历XML中的每一个数据。如例2.1的关于图书图书 的XML,有若 干个book元素,每一本书书可能产产生一条记录记录 。 在XSLT中,使用指令xsl:for-each来实现实现 循环环。格式 为为: 8.4.4 循环 说说明:select属性是必须须的,其expression必须须是 一个序列,称为输为输 入序列。 该该指令根据数据项项的顺顺序处处理每一个项项目,每一 次计计算一个出现现在xsl:for-
42、each指令顺顺序中的项项目,然后继继 续续下去。这这个工作重复进进行,直到所有的数据项项都处处理完 为为止。 如果存在xsl:sort元素,输输入序列被排序后生成一 个有序序列。否则则有序序列与输输入序列相同。 例8.13 使用xsl:for-each 转换转换 例2.1的XSL文档 。 8.4.4 循环 图书图书 列表 图8.6 例2.1的XML文档用上述XSL转换的效果 8.4.4 循环 例8.14 处处理电电影的一个XML文档,可以使用XSL实实 现转换现转换 。 没完没了 葛尤 付彪 功夫 周兴兴弛 黄圣依 梁小龙龙 十面埋伏 刘德华华 章子怡 8.4.4 循环 上面的XML文档可以
43、具有如下的XSL转换转换 (文件名: ch8-14.xsl): movies 图8.7 例8.14的XML文档用此XSL转换的效果 8.4.5 条件处理 在XSLT中,有两种条件处处理指令:xsl:if 和 xsl:choose.。两者使用的方式分别讨论别讨论 。 1. xsl:if xsl:if的语语法格式为为: 说说明:xsl:if有一个强制性的test属性,它是逻辑逻辑 型属 性,expression的内容是一个序列构造。 8.4.5 条件处理 xsl:if的结结果依据test属性表达式的值值。如果返回值值 是真,则计则计 算序列构造,结结果的结结点顺顺序与xsl:if 的结结果 一样样
44、,否则则不计计算序列构造,返回空序列。 例8. 15 控制转换转换 直到最后一个元素。 , 例8.16 每隔一行产产生一个黄色的背景。 8.4.5 条件处理 yellow 2. xsl:choose xsl:choice在众多的可能选项选项 中选择选择 一个。它由一 系列xsl:when跟随任选选的xsl:otherwise元素组组成。这这三个 元素的语语法规则为规则为 : 8.4.5 条件处理 8.4.5 条件处理 说说明:xsl:when和xsl:otherwise作为为的子元素处处 理。每一个xsl:when元素有一个test表达式,xsl:when和xsl:otherwise 元素的内
45、容是一个序列构造。处处理xsl:choose时时,每一个xsl:when依次 被检查检查 ,直到满满足一个xsl:when(test表达式的结结果为为真)为为止,如 果没有一个xsl:when满满足表达式,则处则处 理xsl:otherwise。 在这这个计计算中只有第一个满满足xsl:when的内容才被处处理,且作为为 xsl:choose的结结果返回。如果没有任何xsl:when满满足条件,则计则计 算 xsl:otherwise,并作为为xsl:choose的结结果返回。如果xsl:when和 xsl:otherwise都不满满足条件,则则xsl:choose的结结果是空序列。只要找 到
46、一个满满足条件的xsl:when,后面的xsl:when的test不再计计算。 8.5 样式表设计 在XML文档中调调用XSLT文档时时,需要在XML文档的序言中 写上如下的行即可: 例8.17 学生某学期的成绩绩表如下,根据该该表设计设计 XML 文档和XSL转换转换 文档。 8.5 样式表设计 此表的XML文档如下: 20040112 王凌 85 78 82 58 20040101 刘雯 80 70 8.5 样式表设计 76 70 20031514 张艳丽 67 90 80 75 它的XSL转换程序如下(程序名为ch8-17.xsl): 8.5 样式表设计 student scores l
47、ist 学生成绩表 学号 姓名 英语 计算机基础 高等数学 模拟电子技术 8.5 样式表设计 图8.8 例8.17的XSL转换 图8.8 例8.17的XSL转换 8.5.1 排序 如果要按照某个元素的值值重新排序后输输出。此时时要用 到xsl:sort。它的语语法格式为为: 说说明:select选择选择 被排序的元素名。排序是以什么方 式排序,是升序,还还是降序,由order属性决定, descending为为降序,ascending为为升序。 8.5.1 排序 在例8.17中的行后加上: 可以按照计计算机基础础的成绩绩,从大到小排序。排 序部分的代码码参考如下: 8.5.2 求和与求平均 1
48、. 求和 对对表8.3进进行求总总分和每门课门课 程求平均,可以对对改 表格进进行下面的修改: 要实现这实现这 个统计结统计结 果,应该应该 如何设计设计 XSL文档?XML文 档与表 8.3的一样样,要计计算总总分,可以使用Xpath中的算术术运 算进进行 8.5.2 求和与求平均 计计算。如果求四门课门课 程:english、computer、math、 e_analog的总总分,可以使用下面的XPath表达式: 然后修改XSL转换转换 文档如下: 这样这样 就可以简单简单 地把几门门功课课的成绩绩相加。 8.5.2 求和与求平均 2. 求平均 求每门课门课 程的平均成绩绩,在XSLT 2
49、.0中可以使用 Xpath中的数值值函数avg来实现实现 ,这这个函数是XSLT2.0中新增 的函数。具体方法如下: 如果使用的是XSLT 1.0,可以使用XPath中的数值值 函数sum和count来实现实现 : 其中,sum对对所有的english元素值值求和,count对对所有 的english元素个数计计数,两者相除(div)得到english的 平均值值。同理,可以计计算其他课课程的成绩绩。 8.5.2 求和与求平均 在其他的程序设计语设计语 言中常常使用“/”作为为除 法运算符,为为什么在XSLT中要使用div作为为除法运算符?因 为为“/”被用作模式符(分隔父/子元素)、元素结结束符标标志 等,所以在XSLT中把div作为为除法运算符使用。 在程序ch8-17.xsl中增加一行表格(即 ): 平均分 8.5.2 求和与求平均 或者: 平均分 8.5.2 求和与求平均 例8.18 设计计设计计 算平均值值的XSL转换转换 文档(文件名 ch8-18.xsl)。 程序参考P.256。 如果用此XSL文档对对ch8-17.XML进进行转
链接地址:https://www.31doc.com/p-3157990.html