收藏 分享(赏)

第5章《XSLT》.ppt

上传人:Facebook 文档编号:3426490 上传时间:2018-10-27 格式:PPT 页数:53 大小:265.50KB
下载 相关 举报
第5章《XSLT》.ppt_第1页
第1页 / 共53页
第5章《XSLT》.ppt_第2页
第2页 / 共53页
第5章《XSLT》.ppt_第3页
第3页 / 共53页
第5章《XSLT》.ppt_第4页
第4页 / 共53页
第5章《XSLT》.ppt_第5页
第5页 / 共53页
点击查看更多>>
资源描述

1、5. XSLT (eXtensible Stylesheet Language Transformations),XSLT 中的字母“T”表示“转换”,它是 XSL规范中的一部分。可用于对 XML 树型数据进行结构重组转换的有力工具。可以根据指定的转换规则将一个 XML 文档树或者其中的部分内容转换为另一种文档树形式。 XSLT 所提供的转换功能非常有效,并不仅仅局限于结构上的重组,准确的说,可以将 XML 文档转换为任何形式,包括 XML、HTML 和普通文本,以致于很多人使用 XSL 作为一种在浏览器中显示 XML 数据的工具,也就是利用这种转换功能,将 XML 文档转换为 HTML(通常

2、需要增加一些 HTML 中的有关显示的标记),然后在浏览器中进行显示。XSLT 的功能要比 CSS 强得多。,5.1 XSLT 简介,XSLT 语言是一种声明性(Declarative)的语言,即 XSLT 程序本身只是包含了一些转换规则的 XML 文档。而这些规则可以被递归地应用到转换过程中。 XSLT 处理程序(或称之为执行引擎)将首先确定 XSLT 规则,然后根据规则的匹配条件(通过 XPath 表达式指定)、以及优先顺序完成相应的转换操作。 XSLT本身也是一个 XML 文档,所以它也必须严格遵守 XML 规范。其根元素的命名空间为:http:/www.w3.org/1999/XSL/

3、 Transform。,5.1.1 XSLT 的工作原理,在进行 XSLT 的转换任务时,通常需要两个输入文档,一个是包含源数据的 XML 文档,一个是包含转换任务规则的 XSLT 文档; 由 XML 解析器对这两个文档进行解析,将包含源数据的 XML 文档转换为所对应的文档树结构,将 xslt (xsl) 文档中定义的处理模块看作是一系列的转换规则。 由 XSLT 引擎调用这些规则,对文档树进行遍历,分别处理其中指定的数据节点,将其转换为所需的结果集,并序列化为结果文档。,5.1.2 XSLT 的一个简单示例,hello.xml + hello.xslt XSLT 并不是一种专门用于将 XM

4、L 转换为 HTML 的工具,它的目的是为半结构化数据(树型模型)的转换、查询提供一种通用的实现机制,其输出结果并不仅局限于 HTML,可以是任何所需的文本格式(比如 XML)。 hello2.xml + hello2.xslt,5.2 XSLT 中模板的创建以及内置模板的使用,模板是 XSLT 转换工作的具体规则,所有的转换任务是通过一系列的模板体现出来的。因此,如何声明和调用模板,是 XSLT 转换任务的关键。 在 XSLT 文档中通常至少包含一个模板,即 xsl:template match=“/”,该模板用于处理文档节点(Document Node),相当于 Java 中的“main(

5、.)”函数。,5.2.1 XSLT 中模板的声明和调用,模板在很多方面都与函数非常类似。在使用上,必须首先声明(可以指定模板的名称、参数、返回类型等等),然后在合适的地方显式地调用该模板(在遍历文档树节点的过程中、或者直接调用),才能够执行相应的转换规则。,5.2.1.1 模板的声明,完整的模板声明语法 :, 和 之间的内容相当于一个函数的函数体,表示在调用该模板时应该执行的具体操作。而 xsl:template 元素开始标记中的属性 match、name、mode 和 priority 则用于描述该模板的相关信息,下面对这些属性进行了详细的介绍。,1. 模板的匹配路径属性 match,mat

6、ch 属性的取值涉及到模板的调用。 在 XSLT 中,模板的调用分为两种方式:,根据模板的匹配路径(在遍历的过程中)进行调用,具体有两种情况:对于模板 xsl:template match=“/“,XSLT 处理器将在碰到 XML 文档的文档节点时自动调用该模板;就好像作为程序执行的入口,Java 虚拟机自动调用主类的 main(.) 方法。对于其他的模板 match=other-pattern,将在模板 xsl:template match=“/“ 的转换规则(函数体)中通过指出匹配路径的方式(使用 xsl:apply-templates)进行隐式地、或者显式地调用; 根据模板名称属性(na

7、me),使用 xsl:call-template name=template-name 进行调用。,match 属性的示例,hello2.xslt,模板 1模板 2,match 属性值可以使用绝对路径表达式(比如 “/message“),这表示在遍历文档树的过程中碰到 /message 元素时,需要执行该模板中的内容。换句话说,如果使用相对路径表达式,模板 2 将应用于 /message、/*/message 等等(所有的 message 元素);,2. 模板的名称属性 name,前面的模板 和 ,它们都没有具体的名称,因此将其称为无名模板。这些模板之所以可以没有名称,是因为它们的调用是在遍历

8、文档树的过程中自动进行的,根本不需要名称。,命名模板的示例,也可以使用 name 属性为模板指定一个名称,使其成为命名模板 。,命名模板 one命名模板 anotherSimple output,输出结果为:Simple output,XSLT 处理器将调用命名模板 one(实际上名称 one 没有作用,因为是自动调用的),然后在模板 one 中使用 xsl:call-template 直接调用名为 another 的模板,在模板 another 执行结束之后,继续执行模板 one 的后续指令,这个过程非常类似于函数的调用。,对于一个模板来说,可以同时使用 match 和 name 属性,以便

9、能够在遍历过程中根据路径匹配情况自动地调用、或者使用 xsl:call-template 直接进行地调用。,3. 模板的模式属性 mode,模板的 mode 属性可用于对模板进行进一步的标识。, 模板 1.Do sth for Company Name.模板 2.Do sth for Person Name. ,AcmeDave123,文档中有两种 Name 元素,一种表示 Company 的名称,一种表示 Person 的名称。而对于不同的 Name 元素,如果希望使用不同的模板来进行处理,为了进一步地区分模板 1 和模板 2,使用了 mode 属性(分别为 “C“ 和 “P“)。,4. 模

10、板的优先级属性 priority,priority属性是用来表示模板的优先级。,碰到 Name 元素时将使用 priority 取值较大的模板。, 模板 1.Do sth .模板 2.Do other things. ,5. 模板的返回类型属性 as,模板返回类型属性 as 的取值,表示该模板应该返回的数据类型。, .Do sth . ,表示该模板将会返回一个 XML 元素作为结果,当前其中可能包含子元素和文本内容。比如:,Dave123 ,如果该模板输出多个 XML 元素组成的序列、非 XML 元素的内容、或者文本内容 ,那么 XSLT 处理器在执行模板的过程中将会报错。,模板的返回类型属性

11、 as 是一个可选的参数,如果不指定该参数,则模块可以输出任意的文本内容。,5.2.1.2 模板的调用,1. 在遍历(广度优先遍历)的过程中匹配调用。2. 通过名称直接调用。,1. 使用 xsl:apply-templates 在广度优先、逐层向下的遍历过程中调用模板,XSLT 中 apply-templates 元素的完整语法形式如下所示:,select 和 mode 属性都是可选的,在xsl:apply-templates元素中可以传递调用参数,Hello!,select 属性, 的作用就是指定继续遍历当前节点的所有子节点(以便根据实际路径和模板的match属性取值调用对应的模板),而 s

12、elect 属性(取值为一个 XPath 表达式)允许指定仅遍历当前节点的哪些子节点(以调用相应的模板,如果存在)。 如果将 (a) 的模板 1 中的 更改为 ,那么将仅调用“message 元素”所对应的模板(而不会调用“处理指令”所对应的模板)。这样一来,我们就可以根据具体的转换要求,仅遍历文档树中的部分内容。,mode 属性,而在 xsl:apply-templates 元素中,mode 属性则用于指定需要在 match 属性取值相同的模板中选择哪一个进行调用。当然,需要配合使用 xsl:template 元素和 xsl:apply-templates 元素的 mode 属性。,当然,可

13、以干脆为模板 3 和模板 4 的 match 属性取不同的值,2. 使用 xsl:call-template 调用模板,使用 xsl:with-param 元素,可以在 xsl:call-template 或者 xsl:apply-templates 中传递调用参数。 使用 xsl:template 声明模板时,可以通过 xsl:param 来声明参数。,模板参数的声明和传值,在 xsl:template 元素开始标记和结束标记之间,使用 xsl:param 元素为所在的模板声明相应的模板参数。,.模板正文.使用 “$paramOne“ 和 “$paramTwo“ 引用两个模板参数. ,在 x

14、sl:call-template 元素的开始标记和结束标记之间,可以使用 xsl:with-param 元素为所调用的模板传递所需的参数。,在使用 xsl:with-param 元素时,必须指明具体的模板参数名称,以便为其进行赋值,所以可以不按照声明时的顺序书写,可以使用 xsl:with-param 元素的 as 属性,为形式参数指定数据类型。,5.2.2 XSLT 中的内置模板,内置模板 (Built-in Templates) 是 XSLT 中的一个关键内容,对于理解 XSLT 对 XML 文档树结构的遍历方式、模板调用机制等内容来说,都是至关重要的。,5.2.2.1 对内置模板进行深入

15、地分析,通过一个具体的示例来说明内置模板的存在,并观察和解释各种内置模板的含义、以及处理对象。 empty.xslt,内置模板的完整内容,模板 1模板 2模板 3模板 1模板 2模板 3 ,5.2.2.2 内置模板的作用,内置模板的作用在于,能够让我们集中精力编写相关节点的处理模板,而无需过多地操心整个遍历过程中模板的逐层调用。比如在本示例中,关心的是如何处理 message 元素,那么只需要编写 match=“message” 的模板即可,而该模板的调用,由内置模板来完成。 只有在用户没有自定义处理某个节点的模块规则时,才会调用内置模块中的规则,否则,用户自定义的模块规则将覆盖内置模块中的规

16、则。,.,5.2.2.3 内置模板的使用和覆盖,在使用内置模板(即忽略某些处理模块,从而使得 XSLT 处理器去调用合适的内置模板)时,有一些细节问题需要注意。 contact.xml + Template rule0.xslt Template rule0 solution1.xslt Template rule0 solution2.xslt,5.3 XSLT 模板中各种转换功能的实现,使用 XSLT 中的各种元素 xsl:? 可以完成相应的处理功能,比如 xsl:value-of、xsl:text、xsl:for-each、xsl:sort 等等。 XSLT 实际上是一种基于 XML 的

17、编程语言,在模板中灵活地使用这些转换功能,可以编写出各种各样的处理程序,甚至是递归的函数。,5.3.1 使用 xsl:value-of 提取文本内容,在对 XML 文档进行转换时,在很多情况下,需要提取其中的某些文本内容、或者根据自己的需要生成。,xsl:value-of 元素的完整语法形式为:, 内置模板 2select=“.“ 表示取当前节点的文本内容,在 expression 中可以使用 XPath 表达式。,对于文本节点和属性节点,xsl:value-of select=“.” 当然提取的是文本节点的内容和属性节点的取值; 对元素节点使用 ,那么将得到元素节点的 String-Valu

18、e。,使用 xsl:text 生成文本内容,使用 xsl:text 在输出结果中输出包含空白字符的文本内容。 xsl:text 元素开始标记和结束标记之间的内容会原封不动地输出到结果中,但是其中不能包含任何 XML 的标记。,ILoveYou,5.3.2 使用 xsl:for-each,可以直接使用 xsl:for-each 元素循环处理批量的节点。另外,可以使用 xsl:sort 指定批量处理节点时的顺序。,xsl:sort,xsl:for-each 和 xsl:sort 的使用示例,5.3.3 使用 xsl:if 进行条件判断,使用 xsl:if 元素,可以实现条件判断,其语法形式如下所示

19、:,.条件满足时所执行的指令. ,test 属性是一个必选项,表示要测试的条件。如果在强制转换为布尔值时,此属性中的表达式计算为 True,那么将执行 xsl:if 元素开始标记和结束标记之间的操作。,模板 1模板 2,5.3.4 使用 xsl:choose、xsl:when 和 xsl:otherwise 进行条件分支选择,xsl:choose、xsl:otherwise 和 xsl:when 可以进行多个条件的测试,实际上就相当于 Java 中的 swtich 和 case。,使用示例,5.3.5 在输出结果中创建 XML 节点,要在 XSLT 的输出结果中创建 XML 节点实际上非常容易

20、,只需要编写相应的 XML 标记即可。 有时我们需要根据所处理的内容动态地生成相应的 XML 节点,而不能采取硬编码的形式。,使用 xsl:copy 和 xsl:copy-of,示例,使用 xsl:element 生成 XML 元素,xsl:copy 和 xsl:copy-of 可以将当前节点从源复制到输出,但是不能根据需要生成任意的 XML 节点,而使用 xsl:element 则可以完成这项任务。,使用 xsl:attribute,Hello! 转换为 :,使用 xsl:attribute-set,xsl:attribute-set 用于定义一组属性。xsl:attribute-set 元

21、素的内容包括零个或多个用于指定属性集中的属性的 xsl:attribute 元素。要使用属性集,可以在 xsl:element、xsl:copy 或 xsl:attribute-set 元素中指定 use-attribute-sets 属性。attrset.xslt attrset.xml,使用 xsl:processing-instruction 和 xsl:comment,Processing instruction should appear nexttype=“text/xsl“ href=“some.xslt“,5.3.5 XSLT 中变量的声明和使用,作为一种编程语言,自然离不开变

22、量的声明和使用。 在 XSLT 中,可以使用 xsl:variable 元素声明变量,并在需要的位置进行使用。XSLT 中的变量与 Java 等高级程序设计语言中的变量有相同,也有不同。 相同之处就是变量的基本功能,即用于保存临时的计算结果,以便使用。 不同之处在于,XSLT 是一种处理半结构化树型数据的语言,所以 XSLT 的变量可以保存 XML 数据或者片段,即表示结构化的信息。,xsl:variable 元素,name 属性表示变量的名称,以进行引用,这个属性是必须的。而 select 属性是可选的,如果使用该属性,那么变量值为计算该表达式得出的结果。, Wuhan,变量的赋值,xsl:

23、variable 元素可以通过下列两种备选方法指定变量值: 如果元素具有 select 属性,属性值必须是表达式,变量值是计算该表达式得出的结果。在这种情况下,元素的内容必须是空的。 如果元素没有 select 属性,并且包含非空的内容,例如一个或多个子节点,内容将指定该值。,Dave123,示例,变量声明和使用的示例: variable.xslt + contact.xml 综合示例 names.xslt + indent.xsl,5.4 XSLT 中提供的其他编程机制,为了更好地处理 XML 文档,XSLT 还提供了一些其他的编程机制。,5.4.1 创建和引用模块化的 XSLT 文档,在

24、Java 语言中,可以将多个类组织在一个包中,以便进行管理和使用。 在 XSLT 中,也可以在一个 XSLT 文档中编写各种模板,而在另一个 XSLT 中进行调用,这样可以增强程序的模块化特性。XSLT 提供了两个元素 xsl:include 和 xsl:import,它们允许在一个 XSLT 文档中引用另一个 XSLT 文档中定义的内容。 两者的区别在于,xsl:include 将包含的内容作为在当前 XSLT 文档中声明的内容一样对待(不能重写其中的内容),而 xsl:import 则将导入的内容作为附加的内容对待(可以重写其中的内容)。,示例,Author: ,5.4.2 同时处理多个

25、XML 源文档,在进行 XSLT 转换工作时,通常需要一个 XML 文档和一个 XSLT 文档作为输入。有时需要同时处理多个 XML 文档。比如对于关系数据库中的某个查询计划,可能需要进行基于等值条件的连接操作,这时将涉及到多个数据库表。 根据从一个 XML 文档中检索的数据,再去处理另一个 XML 文档。在这种情况下,需要使用 document() 函数打开另一个 XML 文档。 customers.xml orders.xml MultiDoc.xslt,5.4.3 通过动态索引提高处理的效率,MultiDocs.xslt 通过嵌套循环连接的方法来实现两个 XML 文档之间的等值连接。您可

26、能会想到还可以通过其他的方法来实现等值连接,比如索引嵌套循环连接,即在内层循环中使用索引来查找第二个表,而不是对其进行顺序扫描。这样一来,可以大大地提高查询检索的效率。 在 XSLT 中,也提供了为连接操作建立索引的机制,但是与关系数据库中的索引不同,XSLT 中的索引不是持久化的(并不保存在硬盘中),而是在进行转换的过程中动态生成的(位于内存中),在转换结束之后就会丢弃。尽管如此,但如果需要连接的数据非常大,那么动态建立索引要比顺序扫描的效率高得多。,使用 XSLT 中的动态索引,在 XSLT 中,可以使用 xsl:key 元素建立索引,然后指定键并使用 key() 函数来查询相应的内容。xsl:key 元素的语法形式为:name 指定该索引的名称,以便稍后进行引用。match 指定标识持有该键的节点。use 指定要作为该键的值使用的表达式。 键值可以是下列任一值:属性、子元素或匹配元素的内容。,xsl:key 元素,xsl:key 元素声明了一个命名的索引:即为 XML 文档中指定的元素分配的名值对。该键与 XPath 表达式中的 key() 函数组合使用,帮助您有效地在复杂 XML 文档中访问分配的元素。Key-MultiDoc.xslt,在 XMLSPY 中使用 XSLT,创建和编辑 XSLT 文档 执行和调式 XSLT 文档 www.w3.org/TR/xslt20/,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 中等教育 > 小学课件

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报