首先需要说明一点的是,目前只有 IE 5.5(以及它更高的版本)支持对XSL的解析。
不管技术和程序本身内含的技术是什么,对于用户而言,重要的是程序能够做什么。用户甚至不关心你采用的什么技术,所以在许多情况下,用户希望软件能够向他们显示用XML编码的信息。但是,XML标记并没有提示如何在显示屏或页面上显示信息。
XML实际上是通过对内容做标记来描述其意义,从而使显示与内容相分离。目前,针对XML样式表开发的标准被称为可扩展样式表语言(Extensible Stylesheet Language),即XSL。XSL定义了XML的语法规范,该语法规范将被用来把XML文件转换成HTML、XML或其他格式的文档。一个XSL样式表集合了一系列设计规则,用于从XML文件中抽取信息,并将其转换成HTML等其他格式。这种转换采用了公开的方式,使其能够更加方便地被程序员描述。而且XSL还将提供多种脚本语言的通道,以满足更为复杂的应用需求。
XSL能使Web浏览器直接根据用户的不同需求改变文档的显示法。例如,不需要与服务器进行交互通信,就可以改变数据的显示顺序。通过变换样式表,同一个文档可以显示得更大,或者经过折叠,只显示外面的一层,或者变为打印格式。比如为了方便残疾人阅读,样式表可以将XML译为盲文或可听见的语音,这项功能还给想在汽车里冲浪的人带来了好处:因为将页面转换为语音是非常方便。有几种Web浏览器的最新版本都能阅读XML文档,并采用合适的样式表,在屏幕上对信息进行分类和格式化。基于XML的网站除了运行速度更快、更易使用外,读者可能根本不知道他所看到的是XML文档而不是HTML文档。
XSL本身是一项XML应用。它直接架构在XML语法之上,分为两个部分:第一部分负责将XML的源代码转换为另一种XSLT格式;第二部分提供大量的格式化命令,可用来配合印刷或屏幕显示,精确地设定外观样式格式XSL-FO,这是一种独立于设备的格式。第一部分的转换语法可以用来服务于第二部分。
事实上,XSL的转换语法并不限于将XML转换成FO命令,XSL可以输出任何格式正确的XML文档。因为这个特性,我们可以用它来进行以下几种格式的转换:XML->HTML、XML->XML、XML->SVG以及XML->VRML等。
同时需要注意的是,XML样式语言还正在发展之中。正如XML介于HTML和SGML之间一样,XML的样式表语言XSL标准也介于CSS和DSSSL之间。
XSL在网络中的应用大体分为两种模式:
1.服务器端转换模式: 在这种模式下,XML文件下载到浏览器前先转换成HTML,然后再将HTML文件送往客户端进行浏览。有两种方式:
· 动态方式;即当服务器接到转换请求时再进行实时转换,这种方式对服务器要求较高。如果你的服务器性能较差的话,很可能造成系统拥挤现象。
· 批量方式;事先用XSL将一批XML转换成HTML文件,然后服务器接收到请求后调用转换好的HTML文件即可。实际上就是每天定时或系统空闲的时候在后台做转换,就象饭店每天事先作好的冷盘一样。
2.客户端转换模式: 这种方式是将XML和XSL文件都传送到客户端,由浏览器实时转换。前提是浏览器必须支持XML+XSL。当前流行的浏览器IE和NETSCAPE都支持XML+XSL。
前面已经提到,XSL是由两种方式构成,一种方式用来转换XML文本内容,另一种则是格式化XML文本内容。我们可以通过XSL首先转换(过滤和整理)XML数据内容,然后通过XSL的格式化显示方法定义数据内容显示方式(比如字体、大小、颜色等)。当然实际上也可以定义一个可以被浏览器支持的用来显示转换后的XML数据的方式,目前来讲这种方式往往是转换XML元素为HTML元素。
同时,XSL也可以加入或者移除一些元素到输出文件,也可以重新整理排列这些元素,并且决定哪些元素将要被显示和如何被显示。
写程序的人都知道,理论说的再多,不如一个实例有效,好,现在我们就来举一个例子,说明XSL在XML中的应用。
一个简单的XSL文档分析
首先我们先生成一个XML文档,把它命令为nickmean.xml
<?xml version="1.0" encoding="GB2312"?>
<?xml-stylesheet href="nickmean.xsl" type="text/xsl"?>
<网络用语集合>
<词语>
<名称>美眉</名称>
<含义>表示在网络上横行的漂亮女孩子</含义>
</词语>
<词语>
<名称>恐龙</名称>
<含义>表示在网络上寻找另一个自我的表面张力和比例结构不友好的女孩子</含义>
</词语>
</网络用语集合>
||||||编写一个XSL文档来决定该XML文档的显示格式(该文档名称为nickmean.xsl,也就是上面例子中<?xml-stylesheet href="nickmean.xsl" type="text/xsl"?>这一行指定的href的值),如下:
<?xml version="1.0" encoding="GB2312"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<xsl:template match="/">
<html>
<body>
<xsl:apply-templates select="//网络用语集合/词语"/>
</body>
</html>
</xsl:template>
<xsl:template match="//网络用语集合/词语">
<DIV STYLE="color:blue">
<xsl:value-of select="名称"/>
</DIV>
<DIV STYLE="color:black">
<xsl:value-of select="含义"/>
</DIV>
</xsl:template>
</xsl:stylesheet>
在IE5.5浏览器中的显示结果如下:
如果我们希望以表格的形式显示结果的话,其XSL文档代码如下(当然该文档也需要命名为nickmean.xsl):
<?xml version="1.0" encoding="GB2312"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<xsl:template match="/">
<html>
<body>
<xsl:apply-templates select="网络用语集合" />
</body>
</html>
</xsl:template>
<xsl:template match="网络用语集合">
<table Border="1">
<xsl:for-each select="词语">
<tr>
<td><xsl:value-of select="名称"/></td>
<td><xsl:value-of select="含义"/></td>
</tr>
</xsl:for-each>
</table>
</xsl:template>
</xsl:stylesheet>
其显示结果如下: