» 网友学堂 » XML教程 » 4.3.1 XSL概述
4.3.1 XSL概述
作者:hinet 发表时间:2007-2-25 17:40 阅读:1186次 在百度搜索相关内容

4.3.1 XSL概述


在上一节中我们已经讲了两种样式单中的一种——层叠样式单CSS,本节要介绍的另一种是可扩展样式单语言 XSL(eXtensible Stylesheet Languge),它也是由W3C制定的。 XSL这个样式语言自提出以来争议颇多,前后经过了几番大的修改。XSL最近的一个草案于2000年3月提出,仍然有待进一步修改完善,因此还不能作为正式依据。
CSS是一种静态的样式描述格式,其本身不遵从XML的语法规范。而XSL不同,它是通过XML进行定义的,遵守XML的语法规则,是XML的一种具体应用。这也就是说,XSL本身就是一个XML文档,系统可以使用同一个XML解释器对XML文档及其相关的XSL文档进行解释处理。
XSL由两大部分组成:第一部分描述了如何将一个XML文档进行转换,转换为可浏览或可输出的格式;第二部分则定义了格式对象FO(fomatted object)。在输出时,首先根据XML文档构造源树,然后根据给定的XSL将这个源树转换为可以显示的结果树,这个过程称作树转换,最后再按照FO解释结果树,产生一个可以在屏幕上、纸上、语音设备或其它媒体中输出的结果,这个过程称作格式化。
到目前为止,W3C还未能出台一个得到多方认可的FO,但是描述树转换的这一部分协议却日趋成熟,已从XSL中分离出来,另取名为XSLT(XSL Transformations),其正式推荐标准于1999年11月16日问世,现在一般所说的XSL大都指的是XSLT。与XSLT一同推出的还有其配套标准XPath,这个标准用来描述如何识别、选择、匹配XML文档中的各个构成元件,包括元素、属性、文字内容等。
如前所述,XSLT主要的功能就是转换,它将一个没有形式表现的XML内容文档作为一个源树,将其转换为一个有样式信息的结果树。在XSLT文档中定义了与XML文档中各个逻辑成分相匹配的模板,以及匹配转换方式。值得一提的是,尽管制定XSLT规范的初衷只是利用它来进行XML文档与可格式化对象之间的转换,但它的巨大潜力却表现在它可以很好地描述XML文档向任何一个其它格式的文档作转换的方法,例如转换为另一个逻辑结构的XML文档、HTML文档、XHTML文档、VRML文档、SVG文档等等,不一而足。
使用XSL定义XML文档显示方式的基本思想是:通过定义转换模板,将XML源文档转换为带样式信息的可浏览文档。最终的可浏览文档可以是HTML格式、FO格式、或者其它面向显示方式描述的XML格式(如前面提到的SVG和SMIL),限于目前浏览器的支持能力,大多数情况下是转换为一个HTML文档进行显示。
在XML中声明XSL样式单的方法与声明CSS的方法大同小异:

至于具体的转换过程,既可以在服务器端进行,也可以在客户端进行。两者分别对应着不同的转换模式:
服务器端转换模式
在这种模式下,XML文件下载到浏览器前先转换成HTML,然后再将HTML文件送往客户端进行浏览。有两种方式:
动态方式;即当服务器接到转换请求时再进行实时转换,这种方式无疑对服务器要求较高。
批量方式;实现将XML用XSL转换好一批HTML文件,接到请求后调用转换好的HTML文件即可。
客户端转换模式
这种方式是将XML和XSL文件都传送到客户端,由浏览器实时转换。前提是浏览器必须支持XML+XSL。
下面我们将着重介绍一些XSLT对XML文档的显示转换功能,并将XPath作为XSLT的基础予以介绍。对于FO,因为它的发展道路是路漫漫其修远兮,所以只用较小的篇幅介绍一下,使读者对其有一个概括性的了解
#1 hinet 发表评论于:2007-2-25 17:41
[tr]以下内容含错误标记[/tr]
4.3.2 一个XSLT的简单例子<br> <br><br>为了让读者能够对XSLT有一个感性认识,很快地掌握它的精髓,我们先来看一个XSLT的简单例子。通过剖析这个例子,读者可以掌握一些XSLT的基本语法和功能,甚至可以照葫芦画瓢写出自己的XSLT文档。<br>我们仍然使用前面在讲述CSS时用过的“学生花名册”的例子。在这里,为了使用XSL样式单,样式单声明语句应改为:<br><?xml-stylesheet type="text/xsl" href="mystyle.xsl"?> <br>mystyle.xsl文档如下:<br><?xml version="1.0" encoding="gb2312" ?> <br><xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/TR/REC-html40"> <br><xsl:template> <br><xsl:apply-templates/> <br></xsl:template> <br><xsl:template match="/"> <br><HTML> <br> <HEAD> <br> <TITLE>学生花名册</TITLE> <br> <STYLE> .title{font-size:15pt; font-weight:bold; color:blue } .name{color:red}<br> </STYLE> <br> </HEAD> <br> <body> <P class="title" >学生花名册</P> <br> <xsl:apply-templates select="roster"/> <br></BODY> <br> </HTML> <br></xsl:template> <br><xsl:template match="roster"> <br><TABLE BORDER="1"> <br> <THEAD> <br> <TD> <B>姓名</B> </TD><br> <TD> <B>籍贯</B> </TD> <br> <TD> <B>年龄</B> </TD> <br> <TD> <B>电话</B> </TD> <br> </THEAD><br> <xsl:for-each select="student" order-by="name"> <br> <TR> <br> <TD><B><xsl:value-of select="name"/></B></TD> <br> <TD><xsl:value-of select="origin"/></TD> <br> <TD><xsl:value-of select="age"/></TD> <br> <TD><xsl:value-of select = "telephone"/></TD> <br> </TR><br> </xsl:for-each><br> </TABLE> <br></xsl:template> <br></xsl:stylesheet><br> <br>将上例的XML文档用XSL样式转换为HTML文档的步骤是:先用XML解释器将XML文档解释成DOM对象,相当于建立了原文档的一个节点树。然后用XML解释器解释XSL文档,用模板匹配的方法去遍历XML节点树,将树中的节点按模板的设定转换为模板指示的显示语言,即HTML语言。 <br>为看懂上例中的XSL源码,首先介绍一下XSL的几条主要语句: <br>主要语句 含 义 <br>xsl:stylesheet 声明语句 <br>xsl:template 相当于编程中函数的概念 <br>xsl:template match = "" 相当于函数调用,去匹配引号中指定的节点 <br>xsl:apply-templates 应用模板函数 <br>xsl:apply-templates select ="" 应用模板函数的调用,跳转到引号中指定的模板 <br>xsl:for-each select = "" 循环语句,遍历与引号中的属性值相同的节点 <br>xsl:value-of select = "" 赋值语句,取出引号中指定的属性值 <br>知道了上面这些语句的含义,我们就可以分析一下这段XSLT源代码的执行过程了: <br>在作过XML声明和XSL声明之后,样式单利用<xsl:template> <xsl:apply-templates/> </xsl:template>声明XSL模板,并调用该模板。 <br>根据<xsl:apply-templates/>,系统最先匹配XML源树的根节点。根节点用"/"表示,它的匹配方法在一对<xsl:template match="/">括起的源码中声明。按照这段代码,首先生成带有样式信息的HTML文档的开头一段代码: <br><HTML> <br> <HEAD> <br> <TITLE>学生花名册</TITLE> <br> <STYLE> .title{font-size:15pt; font-weight:bold; color:blue } .name{color:red}<br> </STYLE> <br> </HEAD> <br> <body> <P class="title" >学生花名册</P> <br><br><br>下面,系统看到了<xsl:apply-templates select="roster"/>的指示,于是,它在XML源树中寻找标记为“roster”的节点进行匹配。就象函数调用一样,现在系统跳到了用<xsl:template match="roster">括起的“函数”中继续生成下面的HTML代码: <br> <TABLE BORDER="1"> <br> <THEAD> <br> <TD> <B>姓名</B> </TD><br> <TD> <B>籍贯</B> </TD> <br> <TD> <B>年龄</B> </TD> <br> <TD> <B>电话</B> </TD> <br> </THEAD> <br><br><br>现在,系统又接到了新的指示 <xsl:for-each select="student" order-by="name">。这条指示要求系统寻找标记为“student”的子节点,并按照“name”下的内容将这些节点排序,然后一一处理。 <br>对于每一个“student”子树中的内容,系统为其生成表中一行的内容。每一行包含四列,分别把标记为“name”、“origin”、“age”、“telephone”的子节点的内容填进去。其中“name”下的内容还是粗体显示。对应到本例中的XML数据,生成的HTML代码为: <br> <TR> <br> <TD><B>李华</B></TD> <br> <TD>河北</TD> <br> <TD>15</TD> <br> <TD>62875555</TD> <br> </TR> <br> <TR> <br> <TD><B>张三</B></TD> <br> <TD>北京</TD> <br> <TD>14</TD> <br> <TD>82873425</TD> <br> </TR><br> <br><br><br>处理完<xsl:for-each select="student" order-by="name">中的内容,系统继续生成HTML代码: <br> </TABLE> <br>至此,系统已处理完<xsl:template match="roster">中的所有内容,可以“函数返回”了。<br>系统返回到<xsl:template match="/">括起的源码中,完成HTML最后两行代码的生成: <br></BODY><br></HTML> <br>把上面的HTML代码串起来,就是生成的转换结果文件,它在IE5中的浏览效果为:<br><br>匹配的过程从下面的“节点与模版匹配示意图”看得更加清晰:<br><br>不知读者是否记得,在第一章中,我们也给出了一个关于XSL样式单的例子,生成了列表形式显示的“联系人列表”信息。现在大家就可以自己分析一下这个XSL文件所定义的模板和执行的过程了。