-- 作者:admin
-- 发布时间:2008/2/20 15:21:10
-- [推荐]XML学习资料之四——XSL
1 CSS CSS是Cascading Style Sheets的缩写,可以为HTML网页提供样式信息并控制HTML网页的显示格式。
1、1 简单使用 有CSS文件为: students {display:block; margin:3em; width:27em; height:30em; border-style:groove; border-width:5px; border-color:red; padding:5em; background-image:url(lsq.jpg); background-repeat:no-repeat; background-position:bottom;}
student {display:block; text-align:center;}
相应使用CSS的XML文件,如: <?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/css" href="stu1.css" ?> <students> <student> <number>000001</number> <name>黎明</name> </student> <student> <number>000002</number> <name>赵怡春</name> </student> <student> <number>000003</number> <name>张富平</name> </student> <student> <number>000004</number> <name>白丽</name> </student> <student> <number>000005</number> <name>牛玉德</name> </student> <student> <number>000006</number> <name>姚华</name> </student> <student> <number>000007</number> <name>李南</name> </student> </students>
如果引用的CSS文件不存在,则会显示默认样式,如: <?xml-stylesheet type="text/css" href="" ?>
也可以使用其他的CSS文件来替换样式,如: students { margin-left:2in; color:navy; font-family:Arial; font-size:30pt; background-color:white; display:block }
student { color:yellow; font-family:Arial; font-size:20pt; background-color:blue; display:block }
1、2 CSS的特点 它的好处: 1)格式与结构分离 2)准确控制页面布局 3)样式作用的元素下所有元素内容都受影响,除非自己定义新的样式
缺点: 1)不能选择元素,根元素下的所有元素内容都会显示 2)只能把样式和已经出现在文档中的内容相连接 3)不能显示属性的内容 4)不能重新编排各个元素的顺序和重组 5)不能对中文标签字符进行样式定义
2 XSL XSL是eXtensible Stylesheet Language的缩写,用于对XML文件的显示进行控制,功能强于CSS。XSL文件本身的格式遵守XML语言规范
2、1 简单使用 所使用的XML文件为: <?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="stu.xsl" ?> <students> <student> <number>000001</number> <name>黎明</name> </student> </students>
相应的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="students"> <xsl:value-of select="*"/> </xsl:template> </xsl:stylesheet>
进一步修改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="students"> <b> <xsl:value-of select="*"/> </b> </xsl:template> </xsl:stylesheet>
再次结合更多的HTML标签来增强XSL文件的显示效果,如: <?xml version="1.0" encoding="gb2312" ?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl"> <xsl:template match="/"> <html> <head> <title>学生信息网页</title> </head> <body> <center><img src="lsq.jpg"/></center> <center><h1>学生信息</h1></center> <table border="2" align="center"> <tr> <td>学号</td><td>姓名</td> </tr> <tr> <td><xsl:value-of select="students/student/number" /></td> <td><xsl:value-of select="students/student/name" /></td> </tr> </table> </body> </html> </xsl:template> </xsl:stylesheet>
注意:虽然XSL文件可以引入HTML标签,但是此时的HTML标签必须遵循XML的严格语法规则
也可以再次结合CSS来增强XSL文件的显示效果,如: <?xml version="1.0" encoding="gb2312" ?> <xsl:stylesheet language="vbscript" xmlns:xsl="http://www.w3.org/TR/WD-xsl"> <xsl:template > <html><head> <title>学生信息网页</title> <style> .name {color:yellow; background:#666666; display:block; font-size:large; font-weight:bold;} .content {color:black; background:#cccccc; display:block;} </style> </head> <body> <center><h1 style="color:red">学生信息</h1></center> <table align="center"> <tr><td class="name">学号</td><td class="name"><xsl:value-of select="students/student/number" /></td> </tr><tr> <td class="content">姓名</td> <td class="content"><xsl:value-of select="students/student/name" /></td> </tr> </table> </body> </html> </xsl:template> </xsl:stylesheet>
2、2 XSL的数据处理元素 2、2、1 xsl:stylesheet元素 代表XSL样式表的根元素,里面含有排版模板template,如果template里面没有定义任何内容,将导致XML文件什么也不显示 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="students"> </xsl:template> </xsl:stylesheet>
2、2、2 xsl:value-of元素 用于选择要显示的元素内容,利用此元素可以将元素或者属性的值结合到排版模板中。
它本身是个空元素,利用select属性指定显示的内容,其值必须是完整的路径,如果不是从XML根元素开始的路径,那就是依据上层元素对应的相对路径。要选择属性,还要加上“@”符号。
这个元素所选择的XML文档元素才会显示出来,而且显示的次序只依赖于XSL文件中xsl:value-of元素出现的位置,与XML文档中的元素位置无关
如XSL文件为: <?xml version="1.0" encoding="gb2312" ?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl"> <xsl:template match="/"> <html> <head> <title>学生信息网页</title> </head> <body> <center><img src="lsq.jpg"/></center> <center><h1>学生信息</h1></center> <table border="2" align="center"> <tr> <td>学号</td><td>性别</td><td>姓名</td><td>姓</td><td>名</td> </tr> <tr> <td><xsl:value-of select="students/student/number" /></td> <td><xsl:value-of select="students/student/name/@sex" /></td> <td><xsl:value-of select="students/student/name" /></td> <td><xsl:value-of select="students/student/name/fname" /></td> <td><xsl:value-of select="students/student/name/lname" /></td> </tr> </table> </body> </html> </xsl:template> </xsl:stylesheet>
相应的XML文件为: <?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="stu.xsl" ?> <students> <student> <number>000001</number> <name sex="male"> <fname>黎</fname> <lname>明</lname> </name> </student> </students>
2、2、3 xsl:for-each元素 用于遍历多条XML记录,如果只是使用xsl:value-of元素只能显示第一条记录 此元素需要指定显示元素的上层元素,再利用xsl:value-of元素得到相应的子元素
如XSL文件为: <?xml version="1.0" encoding="gb2312" ?> <xsl:stylesheet language="vbscript" xmlns:xsl="http://www.w3.org/TR/WD-xsl"> <xsl:template > <html><head> <title>学生信息网页</title> <style> .name {color:yellow; background:#666666; display:block; font-size:large; font-weight:bold;} .content {color:black; background:#cccccc; display:block;} </style> </head> <body> <center><h1 style="color:red">学生信息</h1></center> <table align="center"> <xsl:for-each select="students/student" order-by="name"> <tr><td class="name">学号</td><td class="name"><xsl:value-of select="number" /></td></tr> <tr><td class="content">姓名</td><td class="content"><xsl:value-of select="name" /></td></tr> </xsl:for-each> </table> </body> </html> </xsl:template> </xsl:stylesheet>
注意:如果要降序排序,写法为:<xsl:for-each select="students/student" order-by="-name">
另外一个版本的XSL文件为: <?xml version="1.0" encoding="gb2312" ?> <xsl:stylesheet language="vbscript" xmlns:xsl="http://www.w3.org/TR/WD-xsl"> <xsl:template > <html><head> <title>学生信息网页</title> <style> .name {color:yellow; background:#666666; display:block; font-size:large; font-weight:bold;} .content {color:black; background:#cccccc; display:block;} </style> </head> <body> <center><h1 style="color:red">学生信息</h1></center> <table align="center"> <tr><td class="name">学号</td><td class="name">姓名</td></tr> <xsl:for-each select="students/student" order-by="name"> <tr><td class="content"><xsl:value-of select="number" /></td><td class="content"><xsl:value-of select="name" /></td></tr> </xsl:for-each> </table> </body> </html> </xsl:template> </xsl:stylesheet>
相应的XML文件为: <?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="stu.xsl" ?> <students> <student> <number>000001</number> <name>黎明</name> </student> <student> <number>000002</number> <name>赵怡春</name> </student> <student> <number>000003</number> <name>张富平</name> </student> <student> <number>000004</number> <name>白丽</name> </student> <student> <number>000005</number> <name>牛玉德</name> </student> <student> <number>000006</number> <name>姚华</name> </student> <student> <number>000007</number> <name>李南</name> </student> </students>
2、2、4 xsl:copy元素 用于将xsl:value-of获取的文本复制到客户端输出,直接将XML文件中的文本数据显示出来
如XSL文件为: <?xml version="1.0" encoding="GB2312"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl"> <xsl:template> <xsl:copy><!--显示通过xsl:value-of 所获得的数据--> <xsl:value-of /> </xsl:copy> </xsl:template> </xsl:stylesheet>
也可以写成: <?xml version="1.0" encoding="GB2312"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl"> <xsl:template> <xsl:copy><!--显示通过xsl:value-of 所获得的数据--> <xsl:value-of select="*"/> </xsl:copy> </xsl:template> </xsl:stylesheet>
也可以写成(但是格式不完全一样,copy元素中的内容是每个子元素独立的,而不使用copy的方式是以每个除根元素外的一级元素为单位独立的): <?xml version="1.0" encoding="GB2312"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl"> <xsl:template> <!--显示通过xsl:value-of 所获得的数据--> <xsl:value-of/> </xsl:template> </xsl:stylesheet>
相应的XML文件为: <?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="stu.xsl" ?> <students> <student> <number>000001</number> <name>黎明</name> </student> <student> <number>000002</number> <name>赵怡春</name> </student> <student> <number>000003</number> <name>张富平</name> </student> <student> <number>000004</number> <name>白丽</name> </student> <student> <number>000005</number> <name>牛玉德</name> </student> <student> <number>000006</number> <name>姚华</name> </student> <student> <number>000007</number> <name>李南</name> </student> </students>
也可以循环所有元素: <?xml version="1.0" encoding="GB2312"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl"> <xsl:template match="/"> <!--显示通过xsl:value-of 所获得的数据--> <xsl:copy> <xsl:for-each select="students/student" order-by="name"> <xsl:value-of select="number" /><xsl:value-of select="name" /> </xsl:for-each> </xsl:copy> </xsl:template> </xsl:stylesheet>
2、2、5 xsl:attribute元素 为输出文件的HTML控制标签设定属性和属性值,相应的属性值可以从XML文档中获取
如XSL文件为: <?xml version="1.0" encoding="gb2312" ?> <xsl:stylesheet language="vbscript" xmlns:xsl="http://www.w3.org/TR/WD-xsl"> <xsl:template > <html><head> <title>学生信息网页</title> <style> .name {color:yellow; background:#666666; display:block; font-size:large; font-weight:bold;} .content {color:black; background:#cccccc; display:block;} </style> </head> <body> <center> <img> <xsl:attribute name="src"> <xsl:value-of select="students/pic"> </xsl:value-of> </xsl:attribute> </img> </center> <center><h1 style="color:red">学生信息</h1></center> <table align="center"> <tr><td class="name">学号</td><td class="name">姓名</td></tr> <xsl:for-each select="students/student" order-by="name"> <tr><td class="content"><xsl:value-of select="number" /></td><td class="content"><xsl:value-of select="name" /></td></tr> </xsl:for-each> </table> </body> </html> </xsl:template> </xsl:stylesheet>
相应的XML文件为: <?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="stu.xsl" ?> <students> <student> <number>000001</number> <name>黎明</name> </student> <student> <number>000002</number> <name>赵怡春</name> </student> <student> <number>000003</number> <name>张富平</name> </student> <student> <number>000004</number> <name>白丽</name> </student> <student> <number>000005</number> <name>牛玉德</name> </student> <student> <number>000006</number> <name>姚华</name> </student> <student> <number>000007</number> <name>李南</name> </student> <pic>lsq.jpg</pic> </students>
2、2、6 xsl:element 为输出文件生成标签,相应的内容可以从XML文档中获取
如XSL文件为: <?xml version="1.0" encoding="gb2312" ?> <xsl:stylesheet language="vbscript" xmlns:xsl="http://www.w3.org/TR/WD-xsl"> <xsl:template > <xsl:element name="p"> <xsl:value-of select="students/student/name"/> </xsl:element> <xsl:element name="title"> 学生信息网页 </xsl:element> <html><head> <style> .name {color:yellow; background:#666666; display:block; font-size:large; font-weight:bold;} .content {color:black; background:#cccccc; display:block;} </style> </head> <body> <center> <img> <xsl:attribute name="src"> <xsl:value-of select="students/pic"> </xsl:value-of> </xsl:attribute> </img> </center> <center><h1 style="color:red">学生信息</h1></center> <table align="center"> <tr><td class="name">学号</td><td class="name">姓名</td></tr> <xsl:for-each select="students/student" order-by="name"> <tr><td class="content"><xsl:value-of select="number" /></td><td class="content"><xsl:value-of select="name" /></td></tr> </xsl:for-each> </table> </body> </html> </xsl:template> </xsl:stylesheet>
相应的XML文件不变
2、3 模板的使用 2、3、1 xsl:template 用于设置显示的样式,match属性用于指定应用这个样式的元素名称
如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="ClassI"> <font color="red"> <xsl:for-each select="student"> <xsl:value-of select="number"/> <xsl:value-of select="name"/> </xsl:for-each> </font> </xsl:template> <xsl:template match="ClassII"> <font color="blue"> <xsl:for-each select="student"> <xsl:value-of select="number"/> <xsl:value-of select="name"/> </xsl:for-each> </font> </xsl:template> </xsl:stylesheet>
相应的XML文件为: <?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="stu.xsl" ?> <students> <ClassI> <student> <number>000001</number> <name>黎明</name> </student> <student> <number>000002</number> <name>赵怡春</name> </student> <student> <number>000003</number> <name>张富平</name> </student> <student> <number>000004</number> <name>白丽</name> </student> </ClassI> <ClassII> <student> <number>000005</number> <name>牛玉德</name> </student> <student> <number>000006</number> <name>姚华</name> </student> <student> <number>000007</number> <name>李南</name> </student> </ClassII> </students>
2、3、2 xsl:apply-templates 用于使用分离在外部的模板定义来设计模板,在形式上分离的模板定义可阅读性更强
如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="/"> <xsl:apply-templates/> </xsl:template> <xsl:template match="ClassI"> <font color="red"> <xsl:for-each select="student"> <xsl:value-of select="number"/> <xsl:value-of select="name"/> </xsl:for-each> </font> </xsl:template> <xsl:template match="ClassII"> <font color="blue"> <xsl:for-each select="student"> <xsl:value-of select="number"/> <xsl:value-of select="name"/> </xsl:for-each> </font> </xsl:template> </xsl:stylesheet>
相应的XML文件不变
结合HTML标签可以得到更为复杂的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="/"> <xsl:apply-templates/> </xsl:template>
<xsl:template match="ClassI"> <span style="font-size:14pt; color:red; font-weight:bolder; display:block; text-align:center;">一班</span> <table width="40%" align="center" border="1"> <xsl:for-each select="student"> <tr><td colspan="1" width="20%">学号</td> <td colspan="1"><xsl:apply-templates select="number" /></td> </tr><tr> <td>姓名</td> <td width="40%"><xsl:apply-templates select="name" /></td> <td width="10%">学生</td> </tr> </xsl:for-each> </table> </xsl:template>
<xsl:template match="ClassII"> <span style="font-size:14pt; color:red; font-weight:bolder; display:block; text-align:center;">二班</span> <table width="40%" align="center" border="1"> <xsl:for-each select="student"> <tr><td colspan="1" width="20%">学号</td> <td colspan="1"><xsl:apply-templates select="number" /></td> </tr><tr> <td>姓名</td> <td width="40%"><xsl:apply-templates select="name" /></td> <td width="10%">学生</td> </tr> </xsl:for-each> </table> </xsl:template>
</xsl:stylesheet>
相应的XML文件不变
其中,不使用<xsl:value-of select="number"/>,而改用<xsl:apply-templates select="number" />,主要原因在于这样做更能有效进行样式扩展,如: <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl" xml:space="preserve"> <xsl:template> <xsl:apply-templates /> </xsl:template>
<xsl:template match="ClassI"> <span style="font-size:14pt; color:red; font-weight:bolder; display:block; text-align:center;">一班</span> <table width="40%" align="center" border="1"> <xsl:for-each select="student"> <tr> <td width="40%">学号</td> <td width="60%"><xsl:apply-templates select="number" /></td> </tr> <tr> <td width="40%">姓名</td> <td width="60%"><xsl:apply-templates select="name" /></td> </tr> </xsl:for-each> </table> </xsl:template>
<xsl:template match="ClassII"> <span style="font-size:14pt; color:red; font-weight:bolder; display:block; text-align:center;">二班</span> <table width="40%" align="center" border="1"> <xsl:for-each select="student"> <tr> <td width="40%">学号</td> <td width="60%"><xsl:apply-templates select="number" /></td> </tr> <tr> <td width="40%">姓名</td> <td width="60%"><xsl:apply-templates select="name" /></td> </tr> </xsl:for-each> </table> </xsl:template>
<xsl:template match="name"> <font color="blue"> <xsl:value-of/> </font> </xsl:template>
<xsl:template match="number"> <b> <xsl:value-of/> </b> </xsl:template>
</xsl:stylesheet>
注意XSL的版本,应该为: <xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl" xml:space="preserve">
2、4 XSL其他元素 2、4、1 xsl:comment 用于在XSL文件中增加注释,注意它只能使用在XSL文件中,而传统的方式<!--和-->还可以使用在网页和XML中
如XSL文件为: <?xml version="1.0" encoding="gb2312" ?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl"> <xsl:template > <xsl:comment> This is a comment! </xsl:comment> <xsl:for-each select="students/student"> <xsl:value-of select="number" /> <xsl:value-of select="name" /> </xsl:for-each> </xsl:template> </xsl:stylesheet>
相应的XML文件为: <?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="stu.xsl" ?> <students> <student> <number>000001</number> <name>黎明</name> </student> <student> <number>000002</number> <name>赵怡春</name> </student> <student> <number>000003</number> <name>张富平</name> </student> <student> <number>000004</number> <name>白丽</name> </student> <student> <number>000005</number> <name>牛玉德</name> </student> <student> <number>000006</number> <name>姚华</name> </student> <student> <number>000007</number> <name>李南</name> </student> </students>
2、4、2 xsl:node-name 用于得到引用元素的名称,并将其作为一般的文字来处理
如XSL文件为: <?xml version="1.0" encoding="GB2312"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl"> <xsl:template match="/"> <xsl:apply-templates/> </xsl:template>
<xsl:template match="*"> <br/> <!--选取元素的名称--> <xsl:node-name/> <xsl:apply-templates/> </xsl:template>
</xsl:stylesheet>
相应的XML文件不变
上述XSL可以进一步定义成更为灵活的格式,对不同的元素使用不同的格式,如: <?xml version="1.0" encoding="GB2312"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl"> <xsl:template match="/"> <xsl:apply-templates/> </xsl:template>
<xsl:template match="students"> <br/> <xsl:node-name/> <xsl:apply-templates select="student"/> </xsl:template>
<xsl:template match="student"> <br/> ----<xsl:node-name/> <xsl:apply-templates select="number"/> <xsl:apply-templates select="name"/> </xsl:template>
<xsl:template match="number"> <br/> --------<xsl:node-name/> </xsl:template>
<xsl:template match="name"> <br/> --------<xsl:node-name/> </xsl:template>
</xsl:stylesheet>
相应的XML文件为: <?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="stu.xsl" ?> <students> <student> <number>000001</number> <name>黎明</name> </student> <student> <number>000002</number> <name>赵怡春</name> </student> <student> <number>000003</number> <name>张富平</name> </student> <student> <number>000004</number> <name>白丽</name> </student> <student> <number>000005</number> <name>牛玉德</name> </student> <student> <number>000006</number> <name>姚华</name> </student> <student> <number>000007</number> <name>李南</name> </student> </students>
2、4、3 xsl:script和xsl:eval xsl:script用于定义脚本代码 xsl:eval用于调用定义的脚本代码
如XSL文件为: <?xml version="1.0" encoding="gb2312" ?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/TR/WD-xsl"> <xsl:template > <!--调用xsl:script定义的函数hello() --> <xsl:eval> hello() </xsl:eval> </xsl:template> <!--用xsl:script定义的函数hello() --> <xsl:script> function hello() { return "hello world"; } </xsl:script> </xsl:stylesheet>
相应的XML文件不变
2、4、4 xsl:variable 用于定义常量,以代替常用的文本,访问方式为<xsl:value-of select="$常量名称"/>
如XSL文件为: <?xml version="1.0" encoding="gb2312" ?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <xsl:variable name="var"> My Value </xsl:variable> Key= <xsl:value-of select="$var"/> </xsl:template> </xsl:stylesheet>
相应的XML文件不变
2、4、5 xsl:sort 用于对xsl:apply-templates和xsl:for-each的子元素内容进行排序,改变原有输入文档中的内容顺序
如XSL文件为: <?xml version="1.0" encoding="gb2312" ?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/TR/WD-xsl"> <xsl:template > <xsl:for-each select="students/student"> <xsl:sort select="number" order="ascending" case-order="lower-first" data-type="text"> <xsl:value-of select="number" /> <xsl:value-of select="name" /> </xsl:sort> </xsl:for-each> </xsl:template> </xsl:stylesheet>
相应的XML文件不变
[此贴子已经被作者于2010-12-11 19:54:41编辑过]
|