实验4使用XSL将XML文档变换为HTML文档.docx
《实验4使用XSL将XML文档变换为HTML文档.docx》由会员分享,可在线阅读,更多相关《实验4使用XSL将XML文档变换为HTML文档.docx(28页珍藏版)》请在冰豆网上搜索。
实验4使用XSL将XML文档变换为HTML文档
实验4使用XSL将XML文档变换为HTML文档
【实验目的】
掌握XSLT语言的基本标签的使用;熟悉XML文档的树状结构以及与XSL文档树状结
构的关系;了解XSL处理器对于XSL文档的处理方式。
【实验知识】
1.XML简介
XSL代表着可扩充样式表语言(EXtensibleStylesheetLanguage)。
XSL描述的是如何变换XML格式文档为其它格式文档。
XSL由3部分组成:
ØXSLT-转变XML文档的语言。
ØXPath-对XML文档进行操作的语言。
ØXSL-FO-格式化XML文档的语言。
XSLT是一种把XML文件转换成XHTML文档或者其他的XML文档的语言。
2.XSLT语言基本规则及元素
●XSL文档的声明
声明根据W3CXSLT参考标准的XSL样式表的正确的途径是:
stylesheetversion="1.0"
xmlns:
xsl="http:
//www.w3.org/1999/XSL/Transform">
或
transformversion="1.0"
xmlns:
xsl="http:
//www.w3.org/1999/XSL/Transform">
由于XSLT语言是遵循XML文档语法规则的,所以在XSL文档的最前面也必须加上XML文档的声明。
●XSLT语言的基本元素
XSL样式表是由一个或者更多的被称为“模板(templates)”的规则设置(setofrules)组成的。
示例4-1:
Employees.xml文档(后面的所有XSL文档示例都以此XML文档为依据)
xmlversion="1.0"encoding="utf-8"?
>
xml-stylesheettype="text/xsl"href="所要引用的XSL文档的本地路径"?
>
--这是公司雇员的信息-->
zhangsan
25
--月薪小于等于2000元的雇员工资,以现金方式发放-->
1200.00
lisi
28
--月薪小于等于2000元的雇员工资,以现金方式发放-->
1600.00
wangwu
30
--月薪高于2000元的雇员工资,以信用卡转帐的方式发放-->
3500.00
template>元素
该元素用来定义对于某个XSL树状结构中的节点的转换模板。
在该元素中包含一个match属性,使用标记匹配模式指定该模板所要应用的特定节点。
示例4-2:
employees_simple.xsl
xmlversion="1.0"encoding="UTF-8"?
>
stylesheetversion="2.0"xmlns:
xsl="http:
//www.w3.org/1999/XSL/Transform">
templatematch="/">
雇员月薪表
apply-templates/>
template>
stylesheet>
显示结果如图4-1所示:
图4-1例4-2显示结果
实际上,如果在XML文档中引用了一个XSL文档,但是在XSL文档中并没有定义任何文本的话,使用IE来打开该XML文档时,所显示出的内容会和上面所给出的XSL文档被应用时所显示的内容是相同的。
这是因为XSLT中定义了几个默认模板规则,当引用了没个XSL文档,但是XSL文档中又没有显式的定义特定的模板规则话,XSLT处理器会自动调用默认模板规则。
示例4-3:
(将上面的XSL文档中的模板规则删除即得以下内容)
xmlversion="1.0"encoding="UTF-8"?
>
stylesheetversion="2.0"xmlns:
xsl="http:
//www.w3.org/1999/XSL/Transform">
stylesheet>
显示结果如图4-2所示,可以看出这与示例4-2的变换结果相似。
图4-2例4-3显示结果
apply-templares>元素
该元素会把模板应用到当前元素或当前元素的子节点上。
如果用户向只处理与属性值相匹配的子元素的apply-templates>中添加一个select属性。
示例4-4:
employees_apply_templates_select.xsl
xmlversion="1.0"encoding="UTF-8"?
>
stylesheetversion="2.0"xmlns:
xsl="http:
//www.w3.org/1999/XSL/Transform">
templatematch="/">
雇员月薪表
apply-templatesselect="//monthly_pay"/>
template>
templatematch="monthly_pay">
value-ofselect="."/> |
template>
stylesheet>
在上面的XSL文档中具有两个模板规则,分别是:
templatematch="/">和templatematch="monthly_pay">。
在与”/”(XSL文档根节点)匹配的模板规则中,给出了一个apply-templatesselect="//monthly_pay"/>用来说明在处理XSL文档根节点的所有子节点时,当遇到有名为:
monthly_pay的所有子节点,XSL处理器会在XSL文档中查找与之对应的模板规则,并将其应用到monthly_pay节点。
显示结果如图4-3所示:
图4-3例4-4显示结果
value-of>元素
该元素可以用来选取XML元素节点的内容,并其作为文本节点添加到已被转换的输出流中去。
如示例4-4所示,其中的value-ofselect="."/>这是告诉XSL处理器在应用模板规则时,将选择当前节点的内容,把它作为文本节点输出到转换文档中。
for-each>元素
该元素用来依次选择具有指定的节点设置(node-set)的每一个XML元素节点。
示例4-5:
xmlversion="1.0"encoding="UTF-8"?
>
stylesheetversion="2.0"xmlns:
xsl="http:
//www.w3.org/1999/XSL/Transform">
templatematch="/">
雇员月薪表
table{background-color="lightgrey"}
apply-templates/>
template>
templatematch="employees">
姓名 | 年龄 | 月薪 |
---|
for-eachselect="employee">
value-ofselect="name"/> | value-ofselect="age"/> | value-ofselect="monthly_pay"/> |
for-each>
template>
stylesheet>
显示结果如图4-4所示:
图4-5例4-4显示结果
本例中使用for-eachselect="employee">表示将选择所有名为employee标记的元素节点,并应用其后的模块规则。
sort>元素
该元素用于对元素进行排序,该元素只能作为apply-templates>元素和的for-each>元素的子元素使用。
当作为for-each>的子元素时,sort>必须第一个出现。
示例4-6:
(作为for-each>的子节点对名为name的元素节点进行升序排序)
xmlversion="1.0"encoding="UTF-8"?
>
stylesheetversion="2.0"xmlns:
xsl="http:
//www.w3.org/1999/XSL/Transform">
templatematch="/">
雇员月薪表
{background-color="lightgrey"}
apply-templates/>
template>
templatematch="employees">
姓名 | 年龄 | 月薪 |
---|
for-eachselect="employee">
sortorder="ascending"select="name"/>
value-ofselect="name"/> | value-ofselect="age"/> | value-ofselect="monthly_pay"/> |
for-each>
template>
stylesheet>
显示结果如图4-5所示:
图4-5例4-6显示结果
示例4-7:
(作为apply-templates>的子节点对名为name的元素节点进行升序排序)
xmlversion="1.0"encoding="UTF-8"?
>
stylesheetversion="2.0"xmlns:
xsl="http:
//www.w3.org/1999/XSL/Transform">
templatematch="/">
雇员月薪表
apply-templates/>
template>
templatematch="employees">
姓名 | 年龄 | 月薪 |
---|
apply-templates>
sortorder="ascending"select="name"/>
apply-templates>
template>
templatematch="employee">
value-ofselect="name"/> | value-ofselect="age"/> | value-ofselect="monthly_pay"/> |
template>
stylesheet>
显示结果如图4-6所示:
图4-6例4-7显示结果
if>元素
该元素用于对XML文件的内容设置一个条件语句。
要添加一个条件语句,那必须将一个if>元素放在XSL文件里的for-each>里。
示例4-8:
xmlversion="1.0"encoding="UTF-8"?
>
stylesheetversion="1.0"xmlns:
xsl="http:
//www.w3.org/1999/XSL/Transform">
templatematch="/">
雇员月薪表
{background-color="lightgrey"}
apply-templates/>
template>
templatematch="employees">
姓名 | 年龄 | 月薪 |
---|
for-eachselect="employee">
sortorder="ascending"select="name"/>
iftest="age<30">
value-ofselect="name"/>
| value-ofselect="age"/>
| value-ofselect="monthly_pay"/>
|
if>
for-each>
template>
stylesheet>
显示结果如图4-7所示:
图4-7例4-8显示结果
choose>元素
choose>元素通过when>和otherwise>一起配合是用来表达多条件语句。
语法:
choose>
whentest="expression">
...someoutput...
when>
otherwise>
...someoutput....
otherwise>
choose>
示例4-9:
xmlversion="1.0"encoding="UTF-8"?
>
stylesheetversion="1.0"xmlns:
xsl="http:
//www.w3.org/1999/XSL/Transform">
templatematch="/">
雇员月薪表
{background-color="lightgrey"}
apply-templates/>
template>
templatematch="employees">
姓名 | 年龄 | 月薪 |
---|
for-eachselect="employee">
sortorder="ascending"select="name"/>
choose>
whentest="age<25">
value-ofselect="name"/>
when>
whentest="age>25">
value-ofselect="name"/>
when>
otherwise>
value-ofselect="name"/>
|
otherwise>
choose>
value-ofselect="age"/>
|
value-ofselect="monthly_pay"/>
|
for-each>
template>
stylesheet>
显示结果如图4-8所示:
图4-8例4-9显示结果
copy>元素
该元素用于从原文档树中复制出通过标记匹配模式指定的节点和其文本节点,但是不会复制该节点的属性节点和子孙节点。
说明:
使用该元素主要是为了改变现有XML文档的结构或内容,并不适合用于进行显示格式的控制。
另外,通常使用该元素的XSL的文档应用到某个XML文档,通过浏览器并不会显示出复制的节点元素,而只显示对应该节点元素的文本节点子元素。
copy-of>元素
该元素与copy>元素的不同是,它除了会从原文档树中复制出通过标记匹配模式指定的节点外,还会将其属性节点和子孙节点都复制到目标文档树中。
注意:
使用该元素对XML文档进行的变换,和前面的示例不一样。
因为通常情况下不会变换为HTML这种能够被Web浏览器显示的格式,所以转换结果不能显示在Web浏览器中。
那么如何查看该元素编写的XSL文档的变换XML文档后的效果呢?
必须通过以下命令来完成:
示例4-10:
(使用copy>元素复制指定的节点元素)
xmlversion="1.0"encoding="UTF-8"?
>
stylesheetversion="2.0"xmlns:
xsl="http:
//www.w3.org/1999/XSL/Transform">
templatematch="/">
apply-templates/>
template>
templatematch="employees">
copy>
apply-templatesselect="employee"/>
copy>
template>
templatematch="employee">
copy>
apply-templatesselect="name"/>
copy>
template>
templatematch="name">
copy>
value-ofselect="."/>
copy>
template>
stylesheet>
转换结果如图4-9所示:
图4-9例4-10显示结果
本例中,
templatematch="/">
apply-templates/>
template>
上面的模板会匹配所有XML文档中的节点,然后应用相匹配的模板规则。
根据XML文档的结构,能够知道会匹配一次模板1、三次模板2、三次模板3,继而会得到上面的转换的xml文档内容。
(1)由模板:
templatematch="employees">
copy>
apply-templatesselect="employee"/>
copy>
template>
(2)指定将要拷贝当前节点元素employees,所以该模板会复制一个employees节点元素,然后去应用和employee匹配模式相同的模板内容,所以将会处理模板:
templatematch="employee">
copy>