XSLT
(eXtensible Stylesheet Language Transformation)
可扩展样式表语言转换
author:tuiye@126.com
Part I :
理解
XSLT
1)
XSLT
,用于转换
XML
文档的语言;
XSL-FO
(统称
XSL
文档)定义了
XML
源文档转换的准则,
XPath
提供了识别,寻址
与操作
XML
文档一种方式,在这些基础上才是
XSLT
来实现
XML
到目标文档转换的操作。因此我们可以说在整个
XSL
体系中,
XSLT
占据了其核心的部分。
下面来介绍一下
XSL/XSLT
,以下两个表分别列出了
XSL/XSLT
用到的元素
(
Element
)与函数(
Function
),它们是
XSL
的保留词与操作的函数,是
XSL/XSLT
操作时候的标志。
Table 1 : XSLT
元素
XSLT
元素(Elements)
|
元素说明
|
xsl:apply-imports
|
调用重写模板规则。
|
xsl:apply-templates
|
指示 XSLT 处理器根据每个选定节点的类型和上下文找到适合应用的模板。
|
xsl:attribute
|
创建一个属性节点并将其附加到输出元素上。
|
xsl:attribute-set
|
定义命名的属性集。
|
xsl:call-template
|
按名称调用模板。
|
xsl:choose
|
提供多个与
<xsl:otherwise>
元素和
<xsl:when>
元素有关的条件测试。
|
xsl:comment
|
在输出中生成注释。
|
xsl:copy
|
将当前节点从源复制到输出。
|
xsl:copy-of
|
将子树和结果树片断插入结果树。
|
xsl:decimal-format
|
声明一个小数格式,用于控制
format-number
函数所使用的格式模式的解释。
|
xsl:element
|
在输出中创建指定名称的元素。
|
xsl:fallback
|
调用可以为遇到的新元素的行为提供适合的替代行为的模板内容。
|
xsl:for-each
|
重复应用模板,对节点集中的每个节点应用模板。
|
xsl:if
|
允许简单条件模板片断。
|
xsl:import
|
导入另一个 XSLT 文件。
|
xsl:include
|
包含另一个 XSLT 文件。
|
xsl:key
|
声明一个命名的键,用于 XML 路径语言 (XPath) 表达式中的
key()
函数。
|
xsl:message
|
将文本消息发送到消息缓冲区或消息对话框。
|
xsl:namespace-alias
|
使用其他前缀替换与给定命名空间关联的前缀。
|
xsl:number
|
将格式化的数字插入结果树。
|
xsl:otherwise
|
提供多个与
<xsl:choose>
元素和
<xsl:when>
元素有关的条件测试。
|
xsl:output
|
指定在序列化结果树时要使用的选项。
|
xsl:param
|
声明一个命名的参数,在
<xsl:stylesheet>
元素或
<xsl:template>
元素中使用。允许指定默认值。
|
xsl:preserve-space
|
在文档中保留空白。
|
xsl:processing-instruction
|
在输出中生成处理指令。
|
xsl:sort
|
指定
<xsl:for-each>
或
<xsl:apply-templates>
所选的节点列表的排序条件。
|
xsl:strip-space
|
从文档中删除空白。
|
xsl:stylesheet
|
指定 XSLT 文件的文档元素。文档元素包含所有其他 XSLT 元素。
|
xsl:template
|
定义一个可再次使用的模板,用于为特定类型和上下文的节点生成所需的输出。
|
xsl:text
|
在输出中生成文本。
|
xsl:transform
|
执行与
<xsl:stylesheet>
相同的功能。
|
xsl:value-of
|
将选定节点的值作为文本插入。
|
xsl:variable
|
指定表达式中绑定的值。
|
xsl:when
|
提供多个与
<xsl:choose>
元素和
<xsl:otherwise>
元素有关的条件测试。
|
xsl:with-param
|
将参数传递给模板。
|
Table 2 : XSLT
函数
XSLT
函数(Function)
|
函数描述
|
current
|
返回当前节点作为唯一成员的节点集。
|
document
|
提供从 XSLT 样式表中检索由输入流提供的初始数据以外的其他 XML 资源的方法。
|
element-available
|
只有扩展名称是指令的名称时,才返回 True。
|
format-number
|
使用第二个参数指定的格式模式字符串将第一个参数转换为字符串。
|
function-available
|
如果函数在函数库中可用,则返回 True。
|
generate-id
|
返回唯一标识
node-set
参数中按文档顺序的第一个节点的字符串。
|
key
|
检索以前使用
<xsl:key>
语句标记的元素。
|
node-set
|
将树转换为节点集。产生的节点集总是包含单个节点并且是树的根节点。
|
system-property
|
返回的对象表示通过名称标识的系统属性的值。
|
unparsed-entity-uri
|
返回源文档的文档类型定义 (DTD) 中的未解析实体的声明。
|
以上列举到的
XSLT
元素与函数都在《
XSLT
元素使用说明》中有比价详细的阐述,且有比较完整的例子,这里就不再累赘,详细请看以上文档。
XSL
文档本身就是一个
XML
文档,所以它遵守一切
XML
文档的规范。除了这个之外,它还有一些自己的要求,例如
XSL
文档的根节点必须是
<xsl:stylesheet>
或
<xsl:transform>
(两者完全同义)。要了解其一系列规则可以阅读《
XSLT
入门到精通》。
Part II : XSLT
实现构想
XSLT
的转换如下图所示:
Figure 1: XSLT
转换流程
有图可知,一个
XSLT
的转换要求有二个文档:
1
)为
XML
的源文档,是待转换的;
2
)是
XSL
文档(是以
XML
文档来描述的),它是
XSLT
转换的依据,提供了一套转换的规则用于
XSLT
。有了以上两个文档,我们就可以利用
XSLT
转换模块来完成转换工作。我们的目标文件可以是
XML
,
HTML
或文本文档中的一种或几种。
现在来简单描述一下
XSLT
的转换。第一步,就是我们把待转换的源文档利用
DOM
或
XPath
的方式建立一棵操作树;第二步,解析
XSL
文档,建立一棵
XSL
的参考树,此时鉴于
XSL
文档中规则具有上下文关系,因此不采用建立
XSL
的同时执行
XSLT
转换;第三步,利用
XSLT
模块,操作
XSL
树,遍历
XSL
树同时操作
XML
源文档树,查找符合
XSL
规则的元素等,同步建立我们的目标文档树,直到搜索完毕
XSL
树为止;第四步,然后看需要决定输出目标文档与否。
利用
XSLT
做
XML
等文档数据的转换,是利用
XSLT
中的模版(
templates
)来匹配
XML
中的类型(
patterns
)完成的。而描述
XSLT
转换的叫做
stylesheet[6]
(或其同义的
xsl:transform
)。一个
stylesheet
中包含了若干个
template
规则(
template rules
)。一个
template
包含了两部分:
1
)一个与源树匹配的类型(
patterns
);
2
)一个用于转换到目标树的规则。那么目标树建立的过程就是查询相应的
template
规则,并且实现它定义的
template
。每个
XML
必须包含
stylesheet
(
transform
),当然可以利用词法规则简略
stylesheet
的表示,此种情况下,需要利用扩张名来辨认是否是
XSLT
文档。
然而在一份
XSLT
的文档中,或许有几个
template
规则与源树的
element
匹配,而
XSLT
规定只用一个
template rule
可以被实现,这里就需要做一道冲突处理(
conflict
)。冲突处理如下:
1)...
2) ...
一个
XSLT
文档必须包含
这里我们把
XSLT
分为以下几个方面来实现:
1)
XSLT
函数库,见上表;
2)
XSLT
的词法与语法解析,此处类似于
XML
文档的解析;
3) ....
未完待续
附录
[1]
XSL(e
Xtensible
Stylesheet
Language),可扩展样式表语言转换,是一种高级的格式化语言(用XML文档来定义的),用于定义如何显示数据,W3上网址为www.w3.org/TR/xsl提供了1.0版本的说明,其Namespace URI为http://www.w3.org/1999/XSL/Transform,xml:为此Namespace的前缀;
转换的语言,用于提供一套规则,把
XML
数据转换为另一种
XML
,
HTML
文档或其
他文本格式(如
PDF
,
Portal Document File
),W3上网址为www.w3.org/TR/xslt提供了1.0版本的说明
;
[3]
XPath是一种与XSLT截然不同的语言,它为识别与寻址XML数据提供了正规的语法,
与DOM的非常相似,一共定义了7种不同的节点,可在W3上的网址是
www.w3.org/TR/XPath提供了1.0的版本说明;
[4]
XSL-FO(XSL Formatting Objects),即通常情况下的XSL文档;
[5]
例如:www.w3schools.com,一个W3方面的学习网站;
[6]
在XML的序言中加入stylesheet的描述,就可以把XML与XSLT做关联,stylesheet
的结构描述请参阅www.w3.org/TR/xml-stylesheet,而XSLT文档的MIME type是text/xml
或application/xml;