实验五 可扩展样式单语言XSL
一、实验目的
掌握使用XSL显示XML文件的基本方法
二、实验条件
配置有windows记事本、写字板 或 XMLSpy 开发环境的计算机设备。
三、实验原理及相关知识
(1)XSL实际包含三方面的内容:XSLT,XPath以及XSL格式化对象
(2)XSLT中模板的定义
(3)XPath对XML文件片段进行查找、定位
(4)格式化对象将XSL转换结果进行显示
四、实验内容及步骤
1、对以下“booklist.xml”进行XSL定义(设XSL文件名为“booklist.xsl”)
<?xml version="1.0" encoding="GB2312"?>
<Booklist>
<Book>
<BookID>000001</BookID>
<BookType>计算机</BookType>
<BookName>算法与数据结构</BookName>
<Auth>严蔚敏 陈文博</Auth>
<Publisher>清华大学出版社</Publisher>
<Price>24</Price>
<PubDate>2002-1-1</PubDate>
<Quantity>10</Quantity>
</Book>
<Book>
<BookID>000002</BookID>
<BookType>计算机</BookType>
<BookName>软件工程导轮</BookName>
<Auth>张海藩</Auth>
<Publisher>清华大学出版社</Publisher>
<Price>5.4</Price>
<PubDate>1987-6-1</PubDate>
<Quantity>5</Quantity>
</Book>
<Book>
<BookID>000003</BookID>
<BookType>计算机</BookType>
<BookName>XML/JSP网页编程教材</BookName>
<Auth>吴艾</Auth>
<Publisher>北京希望电子出版社</Publisher>
<Price>46</Price>
<PubDate>2001-7-1</PubDate>
<Quantity>15</Quantity>
</Book>
<Book>
<BookID>000012</BookID>
<BookType>工具</BookType>
<BookName>汉语成语字典</BookName>
<Auth>李一华 吕德申</Auth>
<Publisher>四川辞书出版社</Publisher>
<Price>12</Price>
<PubDate>1992-1-1</PubDate>
<Quantity>10</Quantity>
</Book>
<Book>
<BookID>000016</BookID>
<BookType>机械</BookType>
<BookName>机电控制工程</BookName>
<Auth>高钟毓 王永梁</Auth>
<Publisher>清华大学出版社</Publisher>
<Price>19.8</Price>
<PubDate>1994-9-1</PubDate>
<Quantity>19</Quantity>
</Book>
<Book>
<BookID>000018</BookID>
<BookType>工具</BookType>
<BookName>英华大字典</BookName>
<Auth>郑易里</Auth>
<Publisher>商务印书馆</Publisher>
<Price>18.5</Price>
<PubDate>1984-11-1</PubDate>
<Quantity>2</Quantity>
</Book>
</Booklist>
(1)书写XSL定义头部
<?xml version="1.0" encoding="GB2312"?>
(3)编写根节点匹配模板(注意xsl:stylesheet元素是必须要的)
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<table border="2" style="position:absolute;top:30px;left:30px;font:15px">
<tr>
<td style="text-align:center">BookID</td>
<td style="text-align:center">BookType</td>
<td style="text-align:center">BookName</td>
<td style="text-align:center">Auth</td>
<td style="text-align:center">Publisher</td>
<td style="text-align:center">Price</td>
<td style="text-align:center">PubDate</td>
<td style="text-align:center">Quantity</td>
</tr>
[…………]
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
(4)编写XPath节点booklist/book的匹配模板(添加在[…………]处)
<xsl:for-each select="Booklist/Book">
<tr>
<td style="text-align:center"><xsl:value-of select="BookID"/></td>
<td style="text-align:center"><xsl:value-of select="BookType"/></td>
<td style="text-align:center"><xsl:value-of select="BookName"/></td>
<td style="text-align:center"><xsl:value-of select="Auth"/></td>
<td style="text-align:center"><xsl:value-of select="Publisher"/></td>
<td style="text-align:center"><xsl:value-of select="Price"/></td>
<td style="text-align:center"><xsl:value-of select="PubDate"/></td>
<td style="text-align:center"><xsl:value-of select="Quantity"/></td>
</tr>
</xsl:for-each>
(5)在IE中打开带有XSL定义的“booklist.xml”,观察文件显示结果(带XSL定义的XML文件头部如下所示)。
<?xml version="1.0" encoding="GB2312"?>
<?xml-stylesheet type="text/xsl" href="booklist.xsl"?>
(6)修改上述代码,不用<xsl:for-each>语句实现相同的显示结果。
<?xml version="1.0" encoding="GB2312"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<table border="2" style="position:absolute;top:30px;left:30px;font:15px">
<tr>
<td style="text-align:center">BookID</td>
<td style="text-align:center">BookType</td>
<td style="text-align:center">BookName</td>
<td style="text-align:center">Auth</td>
<td style="text-align:center">Publisher</td>
<td style="text-align:center">Price</td>
<td style="text-align:center">PubDate</td>
<td style="text-align:center">Quantity</td>
</tr>
<xsl:apply-templates/>
</table>
</body>
</html>
</xsl:template>
<xsl:template match="Book[1]">
<tr>
<td style="text-align:center"><xsl:value-of select="BookID"/></td>
<td style="text-align:center"><xsl:value-of select="BookType"/></td>
<td style="text-align:center"><xsl:value-of select="BookName"/></td>
<td style="text-align:center"><xsl:value-of select="Auth"/></td>
<td style="text-align:center"><xsl:value-of select="Publisher"/></td>
<td style="text-align:center"><xsl:value-of select="Price"/></td>
<td style="text-align:center"><xsl:value-of select="PubDate"/></td>
<td style="text-align:center"><xsl:value-of select="Quantity"/></td>
</tr>
</xsl:template>
<xsl:template match="Book[2]">
<tr>
<td style="text-align:center"><xsl:value-of select="BookID"/></td>
<td style="text-align:center"><xsl:value-of select="BookType"/></td>
<td style="text-align:center"><xsl:value-of select="BookName"/></td>
<td style="text-align:center"><xsl:value-of select="Auth"/></td>
<td style="text-align:center"><xsl:value-of select="Publisher"/></td>
<td style="text-align:center"><xsl:value-of select="Price"/></td>
<td style="text-align:center"><xsl:value-of select="PubDate"/></td>
<td style="text-align:center"><xsl:value-of select="Quantity"/></td>
</tr>
</xsl:template>
<xsl:template match="Book[3]">
<tr>
<td style="text-align:center"><xsl:value-of select="BookID"/></td>
<td style="text-align:center"><xsl:value-of select="BookType"/></td>
<td style="text-align:center"><xsl:value-of select="BookName"/></td>
<td style="text-align:center"><xsl:value-of select="Auth"/></td>
<td style="text-align:center"><xsl:value-of select="Publisher"/></td>
<td style="text-align:center"><xsl:value-of select="Price"/></td>
<td style="text-align:center"><xsl:value-of select="PubDate"/></td>
<td style="text-align:center"><xsl:value-of select="Quantity"/></td>
</tr>
</xsl:template>
<xsl:template match="Book[4]">
<tr>
<td style="text-align:center"><xsl:value-of select="BookID"/></td>
<td style="text-align:center"><xsl:value-of select="BookType"/></td>
<td style="text-align:center"><xsl:value-of select="BookName"/></td>
<td style="text-align:center"><xsl:value-of select="Auth"/></td>
<td style="text-align:center"><xsl:value-of select="Publisher"/></td>
<td style="text-align:center"><xsl:value-of select="Price"/></td>
<td style="text-align:center"><xsl:value-of select="PubDate"/></td>
<td style="text-align:center"><xsl:value-of select="Quantity"/></td>
</tr>
</xsl:template>
<xsl:template match="Book[5]">
<tr>
<td style="text-align:center"><xsl:value-of select="BookID"/></td>
<td style="text-align:center"><xsl:value-of select="BookType"/></td>
<td style="text-align:center"><xsl:value-of select="BookName"/></td>
<td style="text-align:center"><xsl:value-of select="Auth"/></td>
<td style="text-align:center"><xsl:value-of select="Publisher"/></td>
<td style="text-align:center"><xsl:value-of select="Price"/></td>
<td style="text-align:center"><xsl:value-of select="PubDate"/></td>
<td style="text-align:center"><xsl:value-of select="Quantity"/></td>
</tr>
</xsl:template>
<xsl:template match="Book[6]">
<tr>
<td style="text-align:center"><xsl:value-of select="BookID"/></td>
<td style="text-align:center"><xsl:value-of select="BookType"/></td>
<td style="text-align:center"><xsl:value-of select="BookName"/></td>
<td style="text-align:center"><xsl:value-of select="Auth"/></td>
<td style="text-align:center"><xsl:value-of select="Publisher"/></td>
<td style="text-align:center"><xsl:value-of select="Price"/></td>
<td style="text-align:center"><xsl:value-of select="PubDate"/></td>
<td style="text-align:center"><xsl:value-of select="Quantity"/></td>
</tr>
</xsl:template>
</xsl:stylesheet>
(7)根据“booklist.xml”,编写“bookinfoquery.xsl”,要求能够以表格方式输出BookName的值是以“算法”开头的图书的所有信息。
提示:判断BookName元素的值是否以算法开头可以用starts-with函数,如下:
starts-with(BookName,'算法')
bookinfoquery.xsl:
<?xml version="1.0" encoding="GB2312"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl:template match="/">
<html>
<body>
<table border="2" style="position:absolute;top:30px;left:30px;font:15px">
<tr>
<td style="text-align:center">BookID</td>
<td style="text-align:center">BookType</td>
<td style="text-align:center">BookName</td>
<td style="text-align:center">Auth</td>
<td style="text-align:center">Publisher</td>
<td style="text-align:center">Price</td>
<td style="text-align:center">PubDate</td>
<td style="text-align:center">Quantity</td>
</tr>
<xsl:for-each select="Booklist/Book">
<xsl:if test="starts-with(BookName,'算法')">
<tr>
<td style="text-align:center"><xsl:value-of select="BookID"/></td>
<td style="text-align:center"><xsl:value-of select="BookType"/></td>
<td style="text-align:center"><xsl:value-of select="BookName"/></td>
<td style="text-align:center"><xsl:value-of select="Auth"/></td>
<td style="text-align:center"><xsl:value-of select="Publisher"/></td>
<td style="text-align:center"><xsl:value-of select="Price"/></td>
<td style="text-align:center"><xsl:value-of select="PubDate"/></td>
<td style="text-align:center"><xsl:value-of select="Quantity"/></td>
</tr>
</xsl:if>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
2、下面是一个关于个人简历的XML文档resume.xml,请编写XSLT文档将其转换成HTML格式,以表格的方式显示相关数据,要求HTML页面设计尽量合理美观。
<?xml version="1.0" encoding="UTF-8"?>
<个人简历>
<求职目标>
<职位>软件开发工程师</职位>
<公司>伟豪软件工程</公司>
</求职目标>
<个人信息>
<姓名>张三</姓名>
<性别>男</性别>
<年龄>22</年龄>
<专业>计算机应用</专业>
<毕业院校>武汉大学</毕业院校>
<学历>本科</学历>
<电话>87653005</电话>
</个人信息>
<特长>
<编程语言>Java</编程语言>
<英语等级>CET-6</英语等级>
</特长>
</个人简历>
resume.xsl:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl:template match="/">
<html>
<body>
<table border="2" style="font-family:KaiTi">
<tr>
<td style="text-align:center;font-size:18pt;font-weight:bolder;color:red;font-family:KaiTi" colspan="6">个人简历</td>
</tr>
<tr >
<td colspan="2" style="text-align:center;font-size:14pt;font-weight:bolder;color:red">求职目标</td>
</tr>
<tr>
<td style="text-align:center;color:blue">职位:</td>
<td style="text-align:center" colspan="2"><xsl:value-of select="个人简历/求职目标/职位"/></td>
<td style="text-align:center;color:blue">公司:</td>
<td style="text-align:center" colspan="2"><xsl:value-of select="个人简历/求职目标/公司"/></td>
</tr>
<tr>
<td colspan="2" style="text-align:center;font-size:14pt;font-weight:bolder;color:red">个人信息</td>
</tr>
<tr>
<td style="text-align:center;color:blue">姓名:</td>
<td style="text-align:center"><xsl:value-of select="个人简历/个人信息/姓名"/></td>
<td style="text-align:center;color:blue">性别:</td>
<td style="text-align:center"><xsl:value-of select="个人简历/个人信息/性别"/></td>
<td style="text-align:center;color:blue">年龄:</td>
<td style="text-align:center"><xsl:value-of select="个人简历/个人信息/年龄"/></td>
</tr>
<tr>
<td style="text-align:center;color:blue">专业:</td>
<td style="text-align:center" colspan="2"><xsl:value-of select="个人简历/个人信息/专业"/></td>
<td style="text-align:center;color:blue">毕业院校:</td>
<td style="text-align:center" colspan="2"><xsl:value-of select="个人简历/个人信息/毕业院校"/></td>
</tr>
<tr>
<td style="text-align:center;color:blue">学历:</td>
<td style="text-align:center" colspan="2"><xsl:value-of select="个人简历/个人信息/学历"/></td>
<td style="text-align:center;color:blue">电话:</td>
<td style="text-align:center" colspan="2"><xsl:value-of select="个人简历/个人信息/电话"/></td>
</tr>
<tr>
<td colspan="2" style="text-align:center;font-size:14pt;font-weight:bolder;color:red">特长</td>
</tr>
<tr>
<td style="text-align:center;color:blue">编程语言:</td>
<td style="text-align:center" colspan="2"><xsl:value-of select="个人简历/特长/编程语言"/></td>
<td style="text-align:center;color:blue">英语等级:</td>
<td style="text-align:center" colspan="2"><xsl:value-of select="个人简历/特长/英语等级"/></td>
</tr>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
五、思考题及其它
针对“booklist.xsl”,简述XSLT的执行过程。
- 利用template模板匹配所需要的节点,booklist.xsl中直接匹配根节点
- 定义了一个表格的框架,为后续输出相关数据做好格式准备
- 利用<xsl:for-each>元素依次选择具有指定节点设置的每一个xml元素节点,结果为节点集,针对booklist.xsl而言就是遍历Booklist下的每一个Book,按格式依次输出所需要的数据