1、第5章 XSLT,样式表简介,为什么需要样式表XML数据本身并不包含数据显示的信息 什么是样式表描述结构文档表现方式的文档 使用样式表的意义 数据或内容与表示层分开 W3C推荐的样式表标准: CSS级联样式表 XSL可扩展样式表,样式表,定义:包含一个或多个XML文档的格式化规则的文档。包含指示WEB浏览器如何将原文档的结构翻译为一个能够显示的结构的代码。 任务: 将XML文档转换为另一种结构 描述如何表达被转换的信息,5.1 级联样式表CSS Cascading Style Sheets,是一个文本,包含特殊元素格式特征的一个或者更多的规则和定义。它控制XML文档和HTML文档中的标签如何被
2、格式化。,Css的作用?,1. 能把XML文档翻译成特定的目标,将XML文档转换成另一种结构。包括: 创建一个不变的文本(比如标签和标题) 指定提取所需数据的过滤器 改变元素和属性的顺序 排列内容 完成复杂的转换,根据存在的内容计算值 2. 描述如何表达被转换的信息。包括: 屏幕或页面的布局 将转换的内容分配成列表和段落 属性的规范(例如间距、页边框、对齐和字体),XSL 指扩展样式表语言(EXtensible Stylesheet Language)。 CSS = HTML 样式表,XSL = XML 样式表 XSL 包括三部分: XSLT 一种用于转换 XML 文档的语言。 XPath 一
3、种用于在 XML 文档中导航的语言。 XSLF 一种用于格式化 XML 文档的语言,作用类似于CSS在HTML中的作用。,5.2 可扩展样式表XSL,XSLT (eXtensible Stylesheet Language Transformations),XSLT 中的字母“T”表示“转换”,它是 XSL规范中的一部分。可以根据指定的转换规则将一个 XML 文档树或者其中的部分内容转换为另一种文档树形式。 XSLT 可以将 XML 文档转换为任何形式,包括 XML、HTML 和普通文本,以致于很多人使用 XSL 作为一种在浏览器中显示 XML 数据的工具,也就是利用这种转换功能,将 XML
4、文档转换为 HTML(通常需要增加一些 HTML 中的有关显示的标记),然后在浏览器中进行显示。,XSLT 简介,XSLT 语言是一种声明性(Declarative)的语言,即 XSLT 程序本身只是包含了一些转换规则的 XML 文档。而这些规则可以被递归地应用到转换过程中。 XSLT 处理程序(或称之为执行引擎)将首先确定 XSLT 规则,然后根据规则的匹配条件(通过 XPath 表达式指定)、以及优先顺序完成相应的转换操作。 XSLT本身也是一个 XML 文档,所以它也必须严格遵守 XML 规范。其根元素的命名空间为:http:/www.w3.org/1999/XSL/ Transform
5、。,XSLT 的工作原理,在进行 XSLT 的转换任务时,通常需要两个输入文档,一个是包含源数据的 XML 文档,一个是包含转换任务规则的 XSLT 文档; 由 XML 解析器对这两个文档进行解析,将包含源数据的 XML 文档转换为所对应的文档树结构,将 xslt (xsl) 文档中定义的处理模块看作是一系列的转换规则。 由 XSLT 引擎调用这些规则,对文档树进行遍历,分别处理其中指定的数据节点,将其转换为所需的结果集,并序列化为结果文档。,XSLT处理器的工作过程,XSLT样式表,XML文档,MSXML解析器,XSLT树,源树,XSLT处理器,结果树,XSLT和CSS,样式表声明,把文档声
6、明为 XSL 样式表的根元素是 或 。 注释: 和 是完全同义的,均可被使用! 根据 W3C 的 XSLT 标准,声明 XSL 样式表的正确方法是:或者: ,一个简单 XSLT例子,对一个XML文件进行转换 现在要把下面这个 XML 文档(“cdcatalog.xml“)转换为 XHTML: 创建 XSL 样式表 然后创建一个带有转换模板的 XSL 样式表(“cdcatalog.xsl“):,把 XSL 样式表链接到 XML 文档,向 XML 文档(“cdcatalog.xml“)添加 XSL 样式表引用: 如果您使用的浏览器兼容 XSLT,它会很顺利地把您的 XML 转换为 XHTML。Em
7、pire BurlesqueBob DylanUSAColumbia10.901985 , 元素, 元素定义输出文档的格式。 注释: 是顶层元素(top-level element),必须是 或 的子节点。 属性method 可选。定义输出的格式,xml、html、text 。 属性version string 可选。设置输出格式的 W3C 版本号。(仅在 method=“html“ or method=“xml“ 时使用)。 属性encoding string 可选。设置输出中编码属性的值。 属性indent 可选。在输出结果树时是否要增加空白;该值必须为 yes 或 no。, 元素,例子
8、1,输出是 XML 文档,版本为 1.0。字符编码方式被设置为 “ISO-8859-1”,对输出进行缩进,以增进可读性:. , 元素,例子 2,输出 HTML 文档,版本是 4.0。字符编码方式设置为 “ISO-8859-1”,对输出进行缩进,以增进可读性:. . , 元素, 元素用于构建模板。 模板在很多方面都与函数非常类似。在使用上,必须首先声明(可以指定模板的名称、参数、返回类型等等),然后在合适的地方显式地调用该模板(在遍历文档树节点的过程中、或者直接调用),才能够执行相应的转换规则。,模板的声明,完整的模板声明语法 :, 和 之间的内容相当于一个函数的函数体,表示在调用该模板时应该执
9、行的具体操作。xsl:template 元素开始标记中的属性 match、name、mode 和 priority 则用于描述该模板的相关信息。,模板的属性,match 属性用于关联 XML 元素和模板。match 属性也可用来为整个文档定义模板。 match=“/“ 属性则把此模板与 XML 源文档的根相联系。 match 属性的值是 XPath 表达式。元素内部的内容定义了写到输出结果的 HTML 代码。 name属性用于定义模板的名称。,模板调用的方式,在 XSLT 中,模板的调用分为两种方式:,根据模板的匹配路径(在遍历的过程中)进行调用,具体有两种情况:对于模板 xsl:templa
10、te match=“/“,XSLT 处理器将在碰到 XML 文档的文档节点时自动调用该模板;就好像作为程序执行的入口,Java 虚拟机自动调用主类的 main(.) 方法。对于其他的模板 match=other-pattern,将在模板 xsl:template match=“/“ 的转换规则(函数体)中通过指出匹配路径的方式(使用 xsl:apply-templates)进行隐式地、或者显式地调用; 根据模板名称属性(name)进行调用,使用 xsl:call-template name=template-name 进行调用。,模板调用的示例,也可以使用 name 属性为模板指定一个名称,使
11、其成为命名模板 。,命名模板 one命名模板 anotherHello,XSLT 处理器将调用命名模板 one(实际上名称 one 没有作用,因为是自动调用的),然后在模板 one 中使用 xsl:call-template 直接调用名为 another 的模板,在模板 another 执行结束之后,继续执行模板 one 的后续指令,这个过程非常类似于函数的调用。, 元素, 元素用于提取某个选定节点的值,并把值添加到转换的输出流中 select 属性的值是一个 XPath 表达式。 对于文本节点和属性节点,xsl:value-of select=“.” 当然提取的是文本节点的内容和属性节点的取
12、值 对元素节点使用 ,那么将得到元素节点的 String-Value(该元素及其子元素的文本节点内容之和)。, 元素, 元素可用于选取指定的节点集中的每个 XML 元素。 select 属性的值是一个 XPath 表达式。 xsl:for-each 的开始标记和结束标记之间,是循环处理的过程体,相当于 C# 中 foreach 循环。 xsl:for-each 循环体中的 XSLT 转换指令将应用于 select 属性所选定的节点,每个选定的节点将成为新的上下文。, 元素,结果过滤 通过在 元素中添加一个选择属性的判别式,我们也可以过滤从 XML 文件输出的结果。合法的过滤运算符: = (等于
13、) != (不等于)(大于), 元素, 元素用于对结果进行排序。 如需对结果进行排序,只要简单地在 XSL 文件中的 元素内部添加一个 元素 select 属性指示需要排序的 XML 元素。 data-type 可选。规定被排序的数据的数据类型。默认是 “text”。 Text,number,qname order 可选。规定排序顺序。默认是 “ascending“。 ascending,descending 查看此 XSL 文件, 元素, 元素用于放置针对 XML 文件内容的条件测试。 如需放置针对 XML 文件内容的条件测试,请向 XSL 文档添加 元素。语法.如果条件成立则输出. , 元
14、素,在何处放置 元素 如需添加有条件的测试,请在 XSL 文件中的 元素内部添加 元素:必选的 test 属性的值包含了需要求值的表达式。 上面的代码仅仅会输出价格高于 10 的 CD 的 title 和 artist 元素。例子,元素, 元素用于结合 和 来表达多重条件测试。 语法. 输出 . 输出 ,xsl:choose条件分支选择,xsl:choose、xsl:otherwise 和 xsl:when 可以进行多个条件的测试,实际上就相当于 Java 中的 swtich 和 case。,元素, 元素应用实例 在 CD 的价格高于 10 时向 “Artist“ 列添加粉色的背景颜色。 查看
15、XSLT文件 在 CD 的价格高于 10 时向 “Artist“ 列添加粉色的背景颜色,并在 CD 的价格高于 9 且低于等于 10 时向 “Artist“ 列添加灰色的背景颜色。 另一个例子, 元素, 元素可把一个模板应用于当前的元素或者当前元素的子节点。 select 属性 包含一个XPath表达式,选定应用模板的节点集,就仅仅处理与属性值匹配的子元素。 当没有select属性时,表示选择当前节点的所有子节点。 另一例子,元素, 元素用于在输出文档中创建元素节点。 创建一个名为 “singer“ 的元素,该元素包含每个 artist 元素的值:,元素, 元素用于向元素添加属性。元素会替换名
16、称相同的已有属性。 向 picture 元素添加 source 属性:向 picture 元素添加 source 属性,并使用 “images/name“ 中的值为其赋值:, 元素, 元素可创建当前节点的一个副本(拷贝)。 注释:当前节点的 Namespace 节点会被自动复制,但是当前节点的子节点和属性不会被自动复制! XML源文件Persons.xml 重构该XML文档,使得Person元素有一个FirstName属性和一个LastName属性。 Persons.xslt,元素, 元素可创建当前节点的一个副本。 注释:当前节点的 Namespace 节点、子节点以及属性都会被自动复制! select 属性必需,规定要拷贝的内容。 根据一份订货单PurchaseOrder.xml,生成一个发货单Invoice.xml。 PurchaseOrder.xslt,xsl:copy 和 xsl:copy-of,小结,可扩展的样式语言(Extensible Style Language,XSL) XSL文档的结构 XSLT的元素语法,