您的位置:寻梦网首页编程乐园XML 编程XML技术讲座
XML 编程

XML技术讲座之八

XML文档显示与样式单(下)
方正技术研究院 XML中国论坛网(www.xml.net.cn)吴於茜

可扩展样式单语言XSL

XSL(eXtensible Stylesheet Languge)是描述XML文档样式信息的一种语言,是由W3C制定的。上述的层叠样式单CSS,是一种静态的样式描述格式,其本身不遵从XML的语法规范。而XSL本身就是一个XML文档,系统可以使用同一个XML解释器对XML文档及其相关的XSL文档进行解释处理。XSL最近的一个草案于2000年3月提出,尚未成为正式标准。

XSL由两大部分组成:一部分描述如何将一个XML文档转换为可浏览或可输出的格式;另一部分则定义格式对象FO(fomatted object)。在输出时,首先根据XML文档构造源树,然后根据给定的XSL将这个源树转换为可以显示的结果树,这个过程称作树转换,最后再按照FO解释结果树,产生一个可以在屏幕上、纸上、语音设备或其他媒体中输出的结果,这个过程称作格式化。

到目前为止,W3C还未能出台一个得到多方认可的FO,但是描述树转换的这一部分协议却日趋成熟,已从XSL中分离出来,另取名为XSLT(XSL Transformations),其正式推荐标准于1999年11月16日推出,现在一般所说的XSL大都指的是XSLT。与XSLT一同推出的还有其配套标准XPath,这个标准用来描述如何识别、选择、匹配XML文档中的各个构成元件,包括元素、属性、文字内容等。

使用XSL显示XML的基本思想是通过定义模板将XML源文档转换为带样式信息的可浏览文档。最终的可浏览文档可以是HTML格式、带CSS的XML格式及FO格式。

在XML中使用如下语句声明XSL样式单:

<?xml-stylesheet type="text/xsl" href="mystyle.xsl"?>

XSL在网络中的应用大体分为两种模式:

1.服务器端转换模式

在这种模式下,XML文件下载到浏览器前先转换成HTML,然后再将HTML文件送往客户端进行浏览。有两种方式:

  • 动态方式;即当服务器接到转换请求时再进行实时转换,这种方式无疑对服务器要求较高。
  • 批量方式;实现将XML用XSL转换好一批HTML文件,接到请求后调用转换好的HTML文件即可。

2.客户端转换模式

这种方式是将XML和XSL文件都传送到客户端,由浏览器实时转换。前提是浏览器必须支持XML+XSL。

下面是XSLT的一个简单的例子,通过剖析这个例子,即可掌握XSLT的基本功能。

例子仍然使用前述的顾客信息表的例子,其XML文档与DTD文档请参照CSS部分,只是XML文档的引用样式要改为:

<?xml-stylesheet type="text/xsl" href="mystyle.xsl"?>

mystyle.xsl文档如下:
<?xml version="1.0" encoding="gb2312" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl"
xmlns="http://www.w3.org/TR/REC-html40">
<xsl:template>
<xsl:apply-templates/>
</xsl:template>
 
<xsl:template match="/">
<HTML>
<HEAD>
<TITLE>顾客信息表</TITLE>
<STYLE>
CAPTION{font-size:15pt; font-weight:bold; color:blue }
</STYLE>
</HEAD>
<BODY>
<xsl:apply-templates select="information"/>
</BODY>
</HTML>
</xsl:template>
 
<xsl:template match="information">
<TABLE border="1px">
<CAPTION>顾客信息表</CAPTION>
<THEAD>
<TD> <B>姓名</B> </TD>
<TD> <B>籍贯</B> </TD>
<TD> <B>年龄</B> </TD>
<TD> <B>电话</B> </TD>
</THEAD>
<xsl:for-each select="customer" order-by="name">
<TR>
<TD><B><xsl:value-of select="name"/></B></TD>
<TD><xsl:value-of select="id"/></TD>
<TD><xsl:value-of select="address"/></TD>
<TD><xsl:value-of select = "telephone"/></TD>
</TR>
</xsl:for-each>
</TABLE>
</xsl:template>
</xsl:stylesheet>

将例中的XML文档用XSL样式转换为HTML文档的步骤是:先用XML解释器将XML文档解释成DOM对象,相当于建立了原文档的一个节点树。然后用XML解释器解释XSL文档,用模板匹配的方法去遍历XML节点树,将树中的节点按模板的设定转换为模板指示的显示语言。

为看懂例中的XSL源码,首先介绍一下XSL主要的几条语句:

Xsl:stylesheet
声明语句

Xsl:template
相当于编程中函数的概念

Xsl:template match = ""
相当于函数调用,去匹配引号中指定的节点

Xsl:apply-templates
应用模板函数

Xsl:apply-templates select =""
应用模板函数的调用,跳转到引号中指定的模板

xsl:for-each select = ""
循环语句,遍历与引号中的属性值相同的节点

xsl:value-of select = ""
赋值语句,取出引号中指定的属性值

知道了上面的语句含义,现在就可以分析一下上面的源代码了:

1.用<xsl:template> <xsl:apply-templates/> </xsl:template>声明XSL模板,并调用该模板。

2.系统最先匹配XML原树的根节点,根节点用"/"表示。将根节点转换为带有样式信息的HTML文档的开头的一段代码:
<HTML>
< HEAD>
< TITLE>顾客信息表< /TITLE>
< STYLE>
… …
< /STYLE>
< /HEAD>
< BODY>

然后再调用另一个节点模板,相当于根节点模板的子函数,处理根节点下的子节点"顾客信息表"的模板转换。之后再把HTML的结尾部分添在根节点模板的后面,使其成为一个完整的HTML文档。

3.匹配学生花名册子节点。建立一个表头为"姓名"、"序号"、"地址"、"电话"的表格,并循环遍历"customer"节点,将每个"customer"节点的上述四个属性值取出,放在表格中。读者可自己仔细研究一下这几句,笔者不再赘述。

如何选择样式单

CSS和XSL同属于样式单,它们的区别表现在于CSS既可用于HTML,也可用于XML。但XSL是专门针对XML提出的,它不能处理HTML文档。

另外XSL是一种转换的思想,它最终将XML文档转换为另一种可用于输出的文档,而CSS则没有任何转换动作,在整个过程中没有任何新码产生。

XSL中90%的样式规定在CSS中都有定义,但仍然有一些效果是CSS无法描述的,必须使用XSL不可。这些功能包括文本的置换、根据文本内容决定显示方式、文档内容排序等,都是XSL所独有的。 再者,XSL遵从XML的语法,而CSS的语法自成体系。

选择样式单还要考虑不同浏览器对样式单的支持程度。目前IE5与Mozilla(即Netscape5.0)都支持CSS,但支持的程度都有限。至今为止,IE5尚不能完全支持CSS1,即便是支持的部分也存在很多错误,对于CSS2也只提供部分支持。Mozilla在对CSS的支持上已经优于IE5,它采用新一代的Raptor/Gecko引擎技术,已经能够完全支持CSS1,但对CSS2的支持计划尚不明朗。对XSLT而言,只有IE5支持,Netscape5并不支持。

另外,为弥补传统页面在表现力上的不足,W3C又公布了很多利用XML定义的新标准,如SVG,MathML。其中SVG针对于矢量图形的显示与传输,MathML针对于数学公式的显示与传输,对于这一类XML文档,需要另外开发单独的浏览器或插件,目前还没有达到实用的阶段。

综上所述,一个XML文档的显示方式可以归纳为三种方式:即利用CSS显示、利用XSL转化为FO显示、、利用XSL转化为带有CSS的HTML文档显示。

来源:网络世界