分析和概述
内容:
什么是 XSLT?
XSLT 的角色
XSLT 作为语言
XSLT 处理器的操作
示例样式表
XSLT 的优点
结束语
参考资料
关于作者
评价本文
XSLT 是什么类型的语言,其用途是什么,为什么要这样设计它?这些问题可以有许多不同的答案,初学者往往会感到困惑,因为这种语言与他们以前习惯使用的语言之间有很大差别。本文尝试说明 XSLT。本文并不试图教您编写 XSLT 样式表,它将说明这种语言的起源,它擅长什么,以及您为什么应该使用它。
我撰写本文的初衷是为一篇关于 Saxon 的技术文章提供必要的背景知识,打算提供在传统 XSLT 处理器中使用的实现技巧内幕,从而帮助用户使其样式表的性能达到最大化。但 developerWorks 的编辑们劝说我:这篇介绍应该吸引更广泛的读者,值得作为 XSLT 语言的独立说明而单独发表。
什么是 XSLT?
XSLT 语言由万维网联盟 (W3C) 定义,并且该语言的 1.0 版本在 1999 年 11 月 16 日作为“推荐书”发布(请参阅参考资料)。我已经在拙作 XSLT Programmers' Reference 中提供了全面的规范和用户指南,因此我不打算在本文中涵盖相同内容。确切地讲,本文的目的只是使读者理解 XSLT 适合大规模事物的哪些位置。
XSLT 的角色
XSLT 的最初目的是将信息内容与 Web 显示分离。如其最初定义那样,HTML 通过按抽象概念(如段落、重点和编号列表)定义显示来实现设备独立性。随着 Web 变得越来越商业化,出版人希望其输出质量能达到与印刷品相同的质量。这逐渐导致越来越多地使用具体显示控件,如页面上材料的明确字体和绝对位置。然而不幸的是完全可以预料其副作用,即将相同的内容传递到替代设备,如数字电视机和 WAP 电话(印刷业的行话再现效果)将会变得日益困难。
由于吸收了印刷业使用 SGML 的经验,在 1998 年初定义了一种标记语言 XML,它用于表示独立于显示的结构化内容。与 HTML 使用一组固定概念(如段落、列表和表)不同,XML 标记中使用的标记完全是用户定义的,其用意是这些标记应该与所关注的对象(如人、地点、价格和日期)相关。尽管 HTML 中的元素本质上都是印刷样式(虽然处于抽象级别),而 XML 的目标是元素应该描述实际对象。例如,清单 1 显示了表示足球锦标赛结果的 XML 文档。
清单 1. 表示足球锦标赛结果的 XML 文档
results group="A"
match
date10-Jun-1998/date
team score="2"Brazil/team
team score="1"Scotland/team
/match
match
date10-Jun-1998/date
team score="2"Morocco/team
team score="2"Norway/team
/match
match
date16-Jun-1998/date
team score="1"Scotland/team
team score="1"Norway/team
/match
match
date16-Jun-1998/date
team score="3"Brazil/team
team score="0"Morocco/team
/match
match
date23-Jun-1998/date
team score="1"Brazil/team
team score="2"Norway/team
/match
match
date23-Jun-1998/date
team score="0"Scotland/team
team score="3"Morocco/team
/
XSLT 以传统语言(如 Lisp、Haskell 和 Scheme)中的功能性编程的概念为基础。样式表由模板组成,这些模板基本上是单一功能 -- 每个模板将输出树的一部分定义成一部分输入树的功能,并且不产生副作用。使用无副作用的规则受到严格控制(除了转义成用类似 Java 的语言编写的外部代码)。XSLT 语言允许定义变量,但不允许现有变量更改它的值 -- 即没有赋值语句。这个策略使许多新用户感到困惑,其目的是为了允许逐步应用样式表。其原理是如果语言没有副作用,那么对输入文档做很小的改动时,不必从头执行整个转换就应该可以计算出对输出文档的最后更改。目前必须说这只是理论上的可能,任何现有 XSLT 处理器还不能实现。(注:虽然 XSLT 以功能性编程概念为基础,但它还不是一个完整的功能性编程语言,因为它缺少将函数当作一级数据类型进行处理的能力。)
示例样式表
在这个阶段,使用示例会使语言变得更清楚。清单 2 显示了列出足球赛结果的简单样式表。
清单 2. 足球赛结果的基本样式表
xsl:transform
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
xsl:template match="results"
html
headtitle
Results of Group xsl:value-of select="@group"
/title/head
bodyh1
Results of Group xsl:value-of select="@group"
/h1
xsl:apply-templates
/body/html
/xsl:template
xsl:template match="match"
h2
xsl:value-of select="team[1]" versus xsl:value-of select="team[2]"
/h2
pPlayed on xsl:value-of select="date"/p
pResult:
xsl:value-of select="team[1] "
xsl:value-of select="team[1]/@score",
xsl:value-of select="team[2] "
xsl:value-of select="team[2]/@score"
/p
/xsl:template
/xsl:transform
这个样式表包括两个模板规则,一个匹配 results 元素,另一个匹配 match 元素。results 元素的模板规则输出页面的标题,然后调用 xsl:apply-templates,这是一个 XSLT 指令,它将处理当前元素的所有子代,对于每个子代都使用其适当的模板规则。在本例中,results 元素的所有子代都是 match 元素,所以会用第二个模板规则来处理它们。规则输出了一个标识比赛的次级 HTML 标题(以 "Brazil versus Scotland" 的形式),然后生成 HTML 段落,给出了比赛的日期和两队的比分。
该转换的结果就是一个 HTML 文档,该文档在浏览器中的表示如图 2 所示。
图 2. 清单 2 中样式表的结果
这是一种非常简单的表示信息的方法。然而,XSLT 的功能比这要强大得多。清单 3 包含了另一个可以操作相同源数据的样式表。这次,样式表计算一个比赛名次表,用来显示锦标赛结束时各队的名次。
清单3. 计算球队名次表的样式表
xsl:transform
xmlns:xsl="http://www.w3.org/19显示,或者输入另一个应用程序。
XSLT 的优点
您为什么考虑使用 XSLT?
XSLT 给了您传统高级声明编程语言的所有好处,特别是对于转换 XML 文档的任务。
高级语言带来的实际好处是开发生产力。但实际上,真正的价值源自于更改的潜力。与使用低级 DOM 和 SAX 接口编码的过程性应用程序相比,用于转换 XML 数据结构的 XSLT 应用程序更能适应对 XML 文档细节的更改。在数据库世界中,这种特性叫做数据独立性,正是由于数据独立性导致了诸如 SQL 之类声明性语言的成功,并使旧的引导性数据访问语言走向衰亡。我坚信在 XML 世界中也会这样。
当然与所有声明性语言一样,XSLT 也会降低性能。但是对于大多数应用程序,今天的 XSLT 处理器的性能已经完全能够满足应用程序的需要,并且它会变得越来越好。在我的第二篇文章中,我将讨论 XSLT 处理器中使用的一些优化技巧,如我自己的 Saxon 产品。
结束语
我想要在本文中展示的是 XSLT 是一种用于操作 XML 文档的完整高级语言,就如同 SQL 是操作关系表的高级语言一样。应该注意到 XSLT 不仅是一种样式设计语言,它比 CSS(或者甚至 CSS2)的功能更强大。
我见到过一些应用程序,它们的所有商务逻辑都用 XSLT 编码。在一个三层在线银行系统中,我看到:
从后端操作系统以 XML 消息的形式检索所有数据。
在联机会话的持续时间内,用户的帐户数据在内存中以 XML DOM 形式表示。
所有给用户的信息首先封装成 XML 消息,然后用服务器或客户机附带的 XSLT 转换根据浏览器的性能将这些消息转换成 HTML。
该应用程序的数据都是 XML 格式的,并且逻辑(包括数据访问逻辑、商务逻辑和显示逻辑)都由 XSLT 来实现。我建议每个项目都采用那种体系结构,但这还需要很长时间,我认为我们会在几年之内见到那种系统。
作为一种编程语言,XSLT 有许多特性 -- 从它使用 XML 语法到其功能性编程原理的基础 -- 还不为一般 Web 程序员所熟悉。那意味着一条陡峭的学习曲线和通常遇到许多挫折。当初对于 SQL 也是如此,所有这些表示 XSLT 与以前的编程语言有着本质的区别。但不要放弃:它是功能非常强大的技术,值得努力学习。
参考资料
同一个作者撰写的 Wrox 书籍 XSLT Programmer's Reference。XSLT 语言的综合指南。
W3C 出版的 XSLT 1.0 Recommendation。XSLT 语言的权威性规范。
W3C 出版的 XPath 1.0 Recommendation。XSLT 样式表中使用的 XPath 表达式语法的权威性规范。
XSL-List,一个有关 XSLT 所有事物的繁忙邮件列表,它附带有可搜索档案,由 MulberryTech 进行管理。
www.xslinfo.com,一个很好的网络中央页面,带有到 XSLT 资源的链接,内容包括软件、书籍、教程和其它内容。
关于作者
Michael Kay 在 XML 界非常著名,他是 Saxon XSLT 处理器和 Wrox 书籍 XSLT Programmer's Reference 的作者。多年以前,他就获得了博士学位,他的研究领域是数据库技术。自那时起,他设计了 Codasyl 数据库、关系数据库、面向对象数据库和自由文本数据库软件。
在写作时,Michael 还兼了几份工作(并没有休息)。他刚结束了在 ICL(一家英国 IT 服务公司)24 年的工作,并投奔 Software AG 成为体系结构小组的一员,该小组负责掌控未来 XML 产品的方向。
作者选择这张照片来证明他并非总是象他在 Wrox 书籍中所表现得那样严肃。