关于XSLT

XSLT (eXtensible Stylesheet Language Transformation)
可扩展样式表语言转换 
 
Part I : 理解 XSLT
 
要理解 XSLT[[1]] ,首先要知道 XSLT XSL[[2]] 中的位置。 XSL 含有很多 XML 的核心标准,其包括三部分:
1)  XSLT ,用于转换 XML 文档的语言;
2)  XPath[[3]] ,用于在 XML 文档中起导航( navigate )作用的语言;
3)  XSL-FO[[4]] ,用于格式化 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: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:output
指定在序列化结果树时要使用的选项。
xsl:param
声明一个命名的参数,在 元素或 元素中使用。允许指定默认值。
xsl:preserve-space
在文档中保留空白。
xsl:processing-instruction
在输出中生成处理指令。
xsl:sort
指定 所选的节点列表的排序条件。
xsl:strip-space
从文档中删除空白。
xsl:stylesheet
指定 XSLT 文件的文档元素。文档元素包含所有其他 XSLT 元素。
xsl:template
定义一个可再次使用的模板,用于为特定类型和上下文的节点生成所需的输出。
xsl:text
在输出中生成文本。
xsl:transform
执行与 相同的功能。
xsl:value-of
将选定节点的值作为文本插入。
xsl:variable
指定表达式中绑定的值。
xsl:when
提供多个与 元素和 元素有关的条件测试。
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
检索以前使用 语句标记的元素。
node-set
将树转换为节点集。产生的节点集总是包含单个节点并且是树的根节点。
system-property
返回的对象表示通过名称标识的系统属性的值。
unparsed-entity-uri
返回源文档的文档类型定义 (DTD) 中的未解析实体的声明。
以上列举到的 XSLT 元素与函数都在《 XSLT 元素使用说明》中有比价详细的阐述,且有比较完整的例子,这里就不再累赘,详细请看以上文档。
还有几个网站 [[5]] 也阐述了 XSLT 一些内容。
XSL 文档本身就是一个 XML 文档,所以它遵守一切 XML 文档的规范。除了这个之外,它还有一些自己的要求,例如 XSL 文档的根节点必须是 (两者完全同义)。要了解其一系列规则可以阅读《 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的前缀;
[2]     XSLT eXtensible Stylesheet Language Transformation ),可扩展样式表语言转换,一种
转换的语言,用于提供一套规则,把 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;
 

 

你可能感兴趣的:(XSLT)