实验4 使用XSL将XML文档变换为HTML文档

实验4  使用XSL将XML文档变换为HTML文档
实验4  使用XSL将XML文档变换为HTML文档

实验4 使用XSL将XML文档变换为HTML文档

【实验目的】

掌握XSLT语言的基本标签的使用;熟悉XML文档的树状结构以及与XSL文档树状结构的关系;了解XSL处理器对于XSL文档的处理方式。

【实验知识】

1.XML简介

XSL代表着可扩充样式表语言(EXtensible Stylesheet Language)。

XSL描述的是如何变换XML格式文档为其它格式文档。

XSL由3部分组成:

XSLT-转变XML文档的语言。

XPath-对XML文档进行操作的语言。

XSL-FO - 格式化XML文档的语言。

XSLT是一种把XML文件转换成XHTML文档或者其他的XML文档的语言。

2.XSLT语言基本规则及元素

●XSL文档的声明

声明根据W3C XSLT参考标准的XSL样式表的正确的途径是:

xmlns:xsl="https://www.360docs.net/doc/b011240084.html,/1999/XSL/Transform">

xmlns:xsl="https://www.360docs.net/doc/b011240084.html,/1999/XSL/Transform">

由于XSLT语言是遵循XML文档语法规则的,所以在XSL文档的最前面也必须加上XML 文档的声明。

●XSLT语言的基本元素

XSL样式表是由一个或者更多的被称为“模板(templates)”的规则设置(set of rules)组成的。

示例4-1:Employees.xml文档(后面的所有XSL文档示例都以此XML文档为依据)

元素

该元素用来定义对于某个XSL树状结构中的节点的转换模板。在该元素中包含一个match属性,使用标记匹配模式指定该模板所要应用的特定节点。

示例4-2:employees_simple.xsl

显示结果如图4-1所示:

图4-1 例4-2显示结果

实际上,如果在XML文档中引用了一个XSL文档,但是在XSL文档中并没有定义任何文本的话,使用IE来打开该XML文档时,所显示出的内容会和上面所给出的XSL文档被应用时所显示的内容是相同的。这是因为XSLT中定义了几个默认模板规则,当引

用了没个XSL文档,但是XSL文档中又没有显式的定义特定的模板规则话,XSLT处理器会自动调用默认模板规则。

显示结果如图4-2所示,可以看出这与示例4-2的变换结果相似。

图4-2 例4-3显示结果

元素

该元素会把模板应用到当前元素或当前元素的子节点上。

如果用户向只处理与属性值相匹配的子元素的中添加一个select属性。

示例4-4:employees_apply_templates_select.xsl

xmlns:xsl="https://www.360docs.net/doc/b011240084.html,/1999/XSL/Transform">

雇员月薪表

在上面的XSL文档中具有两个模板规则,分别是:

。在与”/”(XSL文档根节点)匹配的模板规则中,给出了一个 用来说明在处理XSL文档根节点的所有子节点时,当遇到有名为:monthly_pay的所有子节点,XSL处理器会在XSL文档中查找与之对应的模板规则,并将其应用到monthly_pay节点。

显示结果如图4-3所示:

图4-3 例4-4显示结果

元素

该元素可以用来选取XML元素节点的内容,并其作为文本节点添加到已被转换的输出流中去。

如示例4-4所示,其中的 这是告诉XSL处理器在应用模板规则时,将选择当前节点的内容,把它作为文本节点输出到转换文档中。

元素

该元素用来依次选择具有指定的节点设置(node-set)的每一个XML元素节点。

示例4-5:

xmlns:xsl="https://www.360docs.net/doc/b011240084.html,/1999/XSL/Transform">

雇员月薪表

图4-5 例4-4显示结果

本例中使用表示将选择所有名为employee标记的元素节点,并应用其后的模块规则。

元素

该元素用于对元素进行排序,该元素只能作为 元素和的元素的子元素使用。当作为的子元素时, 必须第一个出现。

显示结果如图4-5所示:

图4-5 例4-6显示结果

显示结果如图4-6所示:

图4-6 例4-7显示结果

元素

该元素用于对XML文件的内容设置一个条件语句。要添加一个条件语句,那必须将一个元素放在XSL文件里的里。

示例4-8:

姓名年龄月薪

姓名年龄月薪

显示结果如图4-7所示:

图4-7 例4-8显示结果

元素

元素通过一起配合是用来表达多条件语句。

xmlns:xsl="https://www.360docs.net/doc/b011240084.html,/1999/XSL/Transform">

雇员月薪表

图4-8 例4-9显示结果

元素

该元素用于从原文档树中复制出通过标记匹配模式指定的节点和其文本节点,但是不会复制该节点的属性节点和子孙节点。

说明:使用该元素主要是为了改变现有XML文档的结构或内容,并不适合用于进行显示格式的控制。另外,通常使用该元素的XSL的文档应用到某个XML文档,通过浏览器并不会显示出复制的节点元素,而只显示对应该节点元素的文本节点子元素。

元素

该元素与元素的不同是,它除了会从原文档树中复制出通过标记匹配模式指定的节点外,还会将其属性节点和子孙节点都复制到目标文档树中。

注意:使用该元素对XML文档进行的变换,和前面的示例不一样。因为通常情况下不会变换为HTML这种能够被Web浏览器显示的格式,所以转换结果不能显示在Web浏览器中。那么如何查看该元素编写的XSL文档的变换XML文档后的效果呢?必须通过以下命令来完成:

示例4-10:(使用元素复制指定的节点元素)

xmlns:xsl="https://www.360docs.net/doc/b011240084.html,/1999/XSL/Transform">

转换结果如图4-9所示:

图4-9 例4-10显示结果

本例中,

上面的模板会匹配所有XML文档中的节点,然后应用相匹配的模板规则。根据XML文档的结构,能够知道会匹配一次模板1、三次模板2、三次模板3,继而会得到上面的转换的xml文档内容。(1)由模板:

(2)指定将要拷贝当前节点元素employees,所以该模板会复制一个employees节点元素,然后去应用和employee匹配模式相同的模板内容,所以将会处理模板:

(3)这里将拷贝当前节点employee,然后去应用和name匹配模式相同的模板内容,所以会处理模板:

同上,会拷贝当前节点name。然后应用 选择当前节点的文本子节点。

显示结果如图4-10所示:

图4-10 例4-11显示结果

匹配节点的模式

匹配根节点

匹配元素节点

使用通配符--使用(*)作为通配符

表示匹配任何元素

使用@匹配属性:

XSLT处理器在遍历节点的树状结构是,并不处理属性节点。如果要让处理器处理属性节点,必须显式的调用元素,并使用select属性选择属性节点。

使用斜杠(/)匹配子节点

表示匹配employees元素节点下的任意的employee子节点。

表示匹配employees元素节点下的任意的employee子节点下的任意name子节点

使用双斜杠(//)匹配后代节点

有时候,用户希望对某一类元素节点进行处理,而不管其他节点在树状结构中所处的位置,就可以使用双斜杠(//)来匹配节点。

匹配根节点下的任意name元素节点,不管该节点所处在的位置

匹配employees元素节点下的任意name元素节点。

使用(.)匹配当前节点&使用(..)匹配当前节点的双亲节点

使用或操作符(|)

使用或操作符(|)来可选的匹配多个节点。

匹配任意的name或age元素节点。

匹配employee元素节点下的任意的name子结点或monthly_pay元素节点的mode属性节点。使用[ ]操作符

用户可以在[ ]中指定布尔表达式,用于在节点集中更精确的匹配某一个节点。

等价于

匹配第一个employee子元素节点。

匹配节点的模式

使用node()节点

匹配除了属性节点和根节点之外的任意节点。

使用comment()节点

匹配任意的注释节点

使用text()节点

匹配任意的文本节点

使用name() 节点

获得节点的名字

使用“following::”轴

匹配节点树中某个节点后面的节点

图4-11 例4-12显示结果

模板转换方式说明如下所示:

有此节点开始匹配下面的模板规则。

碰到/employees/employee[1]/name节点后,应用:

模板规则。

此处是循环转换当前节点的后续元素节点的转换规则。

例如:最开始是碰到/employees/employee[1]/name节点,那么就会对其后续节点/employees/employee[1]/age应用中的转换规则。下次循环就会以/employees/employee[1]/age作为当前节点,而选择的后续元素节点/employees/employee[1]/monthly_pay节点,依此类推,直到最后一个元素节点。

然后继续查看/employees/employee[1]/name是否有子节点,如果有那么继续查看是否还有与之匹配的模板规则,没有的话就应用默认的模板规则。在此例中/employees/employee[1]/name 没有子节点。那么转换结束。

用于选择当前节点的元素

节点的标签名字。

显示结果如图4-12所示:

图4-12 例4-13显示结果

示例4-13中使用了node(),表示将匹配当前节点的除了属性和根节点以外的所有节点,包括文本节点和注释节点。模板匹配方式和示例4-12的相似。

图4-13 例4-14显示结果模板转换方式说明如下所示:

="/employees/employee[1] "/>

有此节点开始匹配下面的模板规则。 模

如果有那么继续查看是否还有与之匹配的模板规则,没有的话就应用默认的模板规则。在此例中

/employees/employee[1]还有子节点age 和monthly_pay,但是没有用户定义模板,就会调用默认模板。所以在上图中表格外的最下边就出现了 这两个文本值。

用于选择当前节点的元素节点的标签名字。

【实验内容】

1. 熟悉XSLT 语言的转换规则。

2. 请编写一个XSL 文档应用于下表中的XML 文档中,将其转换得到如下图显示的结果。

要求显示结果如图4-14所示:

图4-14 要求实现的显示结果

3.请编写一个XSL文档应用于下面的XML文档中,将其转换得到如图4-15显示的结

图4-15 要求实现的显示结果

相关主题
姓名年龄月薪