深入XSL--- 构造结果树概述
XSL 是表达样式表(stylesheet)的语言.每一个样式表描述了呈现一类XML源文档的规则.呈现的过程包括两部分:第一,由源树建立结果树 (result tree);第二,结果树被解释并在显示器、纸张或以语音等其他的媒体的格式化形式输出. 第一步,构造结果树,是将模式(pattern)与模板(template)相结合实现的. 模式与源树中的元素相匹配.模板被实例化产生部分结果树.结果树与源树是分离的.结果树的结构可以和源树截然不同.在结果树的构造中,源树可以可以被过滤 和重新排序,还可以增加任意的结构.第二步,格式化,是用该XSL文档规定的格式化词表实现结果树的构造.正规来说,这个词表是一个XML的名域 (namespace).词汇表中的每一种元素类型对应一个格式化对象类.一种格式化对象类表达一种特定的格式化表现方式.例如,块(block)格式化 对象类表示将一段的内容拆成一行一行.词汇表的每个属性对应一种格式化特性.格式化对象类有一特殊的格式化特性集合,这样能够更好地控制格式化对象类的表 现方式;例如,在集合各行之前或之后控制行的缩进,行间距.一个格式化对象能拥有内容,而它的格式化表现应用于其内容.
XSL 可以不需要结果树使用格式化词库,这样能够被用作通用的XML传输.例如,XSL能被用来将XML转化为结构良好的HTML,即为采用HTML定义的元素 类型和属性的XML.当结果树采用了格式化词库,相遵循的XSL实现必须能够根据在该文件中定义的格式化词库的语义解释结果树;它也能将结果树具体化为 XML,但没有必要能这样做.
样 式表包含了一套模板的规则集合.一个模板规则有两个部分:匹配源树中节点的模式(pattern)以及实例化(instantiated)后组成部分结果 树的模板(template).它允许一个样式表可用于有类似源树结构的一大类文档.一个模板包含一些元素,它们规定了文字结果的元素结构.一个模板还可 以包含作为产生结果树片段的指令元素.当一个模板实例化后, 执行每一个指令并置换为其产生的结果树片段.指令能够选择并处理后代的元素. 通过查找可应用的模板规则然后实例化其模板,后代的元素处理后产生了结果树片段.元素只有在被执行的指令选中才作处理.在搜索可用模板规则过程中,不止一 个模板规则可能匹配给定元素的模式.然而,仅应用一个模板的规则.决定采用哪一规则的方法在"模板规则的冲突决定"中说明.XSL用XML的名域(namespaces)来区别属于XSL处理器指令的元素和规定文字结果的树结构的元素.指令元素属于XSL名域.在文档中采用前缀xsl:表示XSL名域中的元素.一个XSL样式表包含了一个xsl:stylesheet稳当元素.该元素可以包含xsl:template元素来规定模板的规则.下面的例子是一个简单的XSL样式表,它为包含emphasis元素的para元素序列构造结果树.result-ns="fo"属性表明正在构造使用格式化对象词库的树.para元素成为了块格式化对象,字体大小为10pt,之前的空格为12pt.
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl" xmlns:fo="http://www.w3.org/TR/WD-xsl/FO" result-ns="fo">
<xsl:template match="/">
<fo:page-sequence font-family="serif">
<xsl:process-children/>
</fo:page-sequence>
</xsl:template>
<xsl:template match="para">
<fo:block font-size="10pt" space-before="12pt">
<xsl:process-children/>
</fo:block>
</xsl:template>
</xsl:stylesheet>
xsl:stylesheet元素也能包含由其他XSL的样式表导入的元素,定义宏的元素,定义全局常量的元素,以及识别源属性为个别元素标记的元素.