XML可扩展样式单语言
XSL是一种语言,通过对XML文档进行转换,然后将转换的结果表现出来。转换的过程是根据XML文档特性运用XSLT(XML Transformations)将XML文档转换为树形结构(结果树),这棵树是带有样式信息的。再按照FO(Formatted object)分析结果树,将XML文档表现出来。
XSL表现XML文档的两个步骤,建树和表现树。其中,建树可以在服务器端执行,也可以在客户端执行。在服务器端执行时,在服务器端转换生成HTML文档,然后传给客户端浏览。如果在客户端执行则需要客户端支持XML和XSL,因为从服务器端传来的是XML和XSL文档,这些文档在客户解析执行。
下面是一个完整的使用XSL样式单的例子。通过这个例子,为大家介绍XSLT的转换方法和XSLT的书写格式。
程序清单3-8:example-3-7.xml
<?xml version="1.0" encoding="gb2312"?>
<?xml-stylesheet type="text/xsl" href="example-3-8.xsl"?>
<档案>
<学生 性别="0">
<姓名>张三</姓名>
<ID>001</ID>
<年龄>16</年龄>
<电话>12345678</电话>
</学生>
<学生 性别="1">
<姓名>李四</姓名>
<ID>002</ID>
<年龄>20</年龄>
<电话>23456789</电话>
</学生>
<学生 性别="0">
<姓名>王五</姓名>
<ID>003</ID>
<年龄>19</年龄>
<电话>34567890</电话>
</学生>
</档案>
程序清单3-9:example-3-8.xsl
<?xml version="1.0" encoding="gb2312"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<xsl:template><xsl:apply-templates/></xsl:template>
<xsl:template match="档案">
<html>
<head>
<title>学生档案示范</title>
</head>
<body>
<table border="2" title="这是一个学生档案示范." align="center">
<caption>学生档案示范</caption>
<tr bgcolor="yellow">
<th>姓名</th>
<th>学号</th>
<th>年龄</th>
<th>联系电话</th>
</tr>
<xsl:for-each select="学生">
<tr>
<td><xsl:value-of select="姓名"/></td>
<td><xsl:value-of select="ID"/></td>
<td><xsl:value-of select="年龄"/></td>
<td><xsl:value-of select="电话"/></td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
example-3-7.xml是一个XML文档,我们用XSL样式单example-3-8.xsl来表现这个XML文档。
XSL文档本身也是XML文档,所以第一行和XML文档一样,是文档声明。第二行声明了本XSL样式单的名称空间。
第四行指明应用模板函数。第5-31行是模板函数的定义。第5行说明了模板要匹配的节点。
XSL还提供一种类似于函数调用的方法去匹配模板。其形式为:
……
<xsl:apply-templates select="A"/>匹配参数为A的模板
……
<xsl:template match="A">参数为A的模板定义
……
</xsl:template>标记的匹配
通过上面的例子,我们可以知道XSLT实际上是通过模板(template)将源文档按照模板的格式转换为结果文档的。模板定义了一系列的元素来描述源文档中的数据和属性等内容,在经过转换之后,建立树形结构(带信息的结果树)。
在示例中,我们使用了循环来匹配模板:
<xsl:for-each select="学生">
<tr>
<td><xsl:value-of select="姓名"></td>
<td><xsl:value-of select="ID"></td>
<td><xsl:value-of select="年龄"></td>
<td><xsl:value-of select="电话"></td>
</tr>
</xsl:for-each>
这是一种类似于函数的调用的匹配方式。"xsl:for-each"元素循环调用"xsl:value-of"元素来匹配不同的标记,直至将所有的"学生"标记都匹配一遍后,才结束循环。