XSLT 为 Web 应用程序的新浪潮提供动力

作者:Cameron Laird

可扩展样式表转换语言 (XSLT) 是一种专门用于将 XML 文档映射到其他 XML 文档的计算语言。

解释 XSLT 并非易事。问题在于多样性;XSLT 有许多用途,XSLT 引擎有许多实例,并且 XSLT 应用程序涉及许多协作技术,因此重要的是关注要点。

通用 XML

XSLT 的首要要素是其可扩展标记语言 (XML) 基础(另请参阅“XSLT 术语表”侧边栏)。XML 是一种通用数据格式,旨在编码所有内容:算法数据、程序和文档,从采购订单到圣经翻译,使用任何人类语言,在任何类型的计算机和操作系统上。XML 看起来像 HTML,但它稍微复杂一些。实际上,XML 的设计目标之一是以保留 HTML 专家的舒适感的方式来概括 HTML。甚至有一种称为 XHTML 的 XML 变体,允许直接解释为 HTML。《Linux Journal》 经常发表关于 XML 不同方面的文章。

在许多方面,一个完全 XML 化的世界是一个更简单的世界。例如,要分析应付账款部门的运作,您不需要知道谁向谁汇报、谁应该休三周的假以及所有其他混乱的人为细节。如果您可以绘制一张图表,显示发票的流入和付款的流出,可能还带有沿途产生的授权记录,那么您就抽象出了应该是基本信息的内容。

这是一个令人着迷的洞察力。它承诺一个可以将一个 XML 文档(发票)转换为一个或多个其他 XML 文档(付款支票、授权记录)的系统,至少可以组织,甚至可能解决所有有意义的组织自动化。这就是为什么 XSLT 现在看起来如此重要的原因。

具有 XML 世界背景的读者应该概括他们的项目经验,以了解 XSLT 的真正价值。任何具有 XML 实践知识的人都知道,它只是解决方案的开始,而不是营销手册经常宣传的灵丹妙药。XSLT 完全相同:一种有用甚至强大的方式来组织适合生产的工程应用程序的实际工作。转换 XML 文档的想法很重要;要了解它是否是正确的想法,需要密切关注技术细节。

您自己的引擎

为了开始您的 XSLT 职业生涯并帮助您正确地感受这门语言,您需要一个您自己的引擎或语言处理器。最广泛使用的引擎基于 Java 和/或是专有的。这些通常集成到更大的服务器产品中:数据库服务器、应用程序服务器等等。

本文不介绍上述任何一种,而是根据 tDOM 引擎介绍其示例。tDOM 有几个优点,其中最重要的是它在宽松的开源许可下可用,它在内存上非常节俭,并且在我们基准测试中比竞争对手的 XSLT 引擎快两倍,它的安装快速而紧凑,并且它公开了一种可编写脚本的命令模式,这对于教学来说很方便。此外,tDOM 非常适合下面解释的双层编程风格,并且它足够健壮,可以在多个要求苛刻的站点投入生产使用。

要设置您自己的 tDOM 副本,请参阅“如何开始 XSLT 编程”侧边栏。该侧边栏以 XSLT 使用的第一个示例结尾,调用如下:

tclsh8.3 xslt.tcl example1.xml example1.xsl
example1.html

此命令行表示,“使用 Tcl 解释器版本 8.3 启动 xslt.tcl 程序。xslt.tcl 实用程序将 example1.xsl 样式表应用于 example1.xml 文档,并生成 example1.html 作为其输出。”

首先将其视为一台机器,它将 example1.xml 作为其输入,并生成 example1.html,其中只有几行

<?xml version="1.0"?>
<datum>first message</datum>

将 example1.html 视为将其扩展为格式良好的 HTML

<html><body><h1>first message</h1></body></html>
XML 作为数据和代码

如果您只需要像 example1.html 这样的简单 HTML 文档,您可以直接编写它或使用轻量级宏语言,而不是学习 XSLT。当您查看更复杂的示例时,XSLT 的价值开始显现。您可以设置 XSLT 转换以生成特定样式的 example1.html 输出,可能带有经批准的字体或样板站点超链接和免责声明。

XSLT 使用样式表语言来指定这些转换。虽然样式表在 XSLT 发明之前就已经使用,但本文忽略了其他用途,并将 XSLT 样式表始终简称为样式表。

在某种程度上,样式表就是一个程序。就像

int main()
{
    puts("Hello.");
}

是 C 程序的源代码一样,样式表是 XSLT 程序的源代码。然而,样式表的一个特点是它们本身就是 XML 文档。XSLT 源代码不是看起来像普通的计算机程序(例如 C、Java 和 ksh 那样),而是一种标记文本(参见列表 1)。

列表 1. example1.xsl

用 XML 典型的冗长风格来说,这大致是说,“充当一个程序,该程序提取 <datum> 元素并将其内容放入格式良好的 HTML 的 <h1> 标题中。” 这就是 example1.html 的生成方式。

实现此 XSLT 解释的应用程序本身就是一个 Tcl 程序。在这一点上,您几乎不需要学习 Tcl。tDOM 通过 Tcl 绑定公开其 XSLT 引擎,并且 xslt.tcl 脚本只是将命令行变量视为 XML 文档的文件名,并将它们传递给引擎。

让我们回顾一下示例调用。在

tclsh8.3 xslt.tcl example1.xml example1.xsl
example1.html

tclsh8.3 是我们启动的可执行程序的名称,xslt.tcl 是一个最小的 Tcl 脚本,它包装了 tDOM XSLT 引擎。如果我们想改进此实用程序的错误处理,改进 xslt.tcl 将是自然的起点。

运行 xslt.tcl 会创建一个 XSLT 处理器,该处理器接收三个文件名。example1.xml 文件是一个示例 XML 源文档。此文件命名了我们应用于 example1.xml 的样式表。该过程将生成的输出文档写入 example1.html。通过命名不同的 XML 源(可能是 example2.xml)来选择 example1.html 的不同逻辑内容。要更改输出的样式,请重写 example1.xsl。

您现在已成功运行了一个 XSLT 程序。剩下要学习的只是 XSLT 作为一种语言的细节以及它如何应用于实际问题。在更多关于 XSLT 的语法和语义之前,让我们看看它的用途。

一种语言,多种应用

假设您负责一个拥有数万页面的网站。您在一个组织特定的 XML 词汇表中维护这些页面,该词汇表去除了格式信息和 HTML 瑕疵;您的文档仅包含每个页面的特定逻辑内容。访问者当然需要 HTML,但您可以自动生成 HTML,以及标准的标题、框架、导航栏、脚注以及我们在 Web 上期望的所有其他装饰。XSLT 使您能够立即为所有数千个托管文档更新站点样式。此外,它还在 XML 内容文件和 XSLT 样式表之间巧妙地划分了责任,以便不同的专家可以有效地协作。

这种行政级别的描述掩盖了相当多的实现可变性。XSLT 转换发生在何处以及何时?您可能有一个 XML 文档后端,您可以使用命令行 XSLT 解释器定期处理这些文档,以生成由传统 Web 服务器提供的静态 HTML 文档。您可以将 XML 源保存在数据库中,从中检索 XML、转换后的 HTML 甚至完整的 HTTP 会话。各种应用程序服务器、内容管理器甚至 XML 数据库都提供这些接口中的每一个。另一种变化是:您可能只将源保存在服务器上,并结合使用 HTML 扩展和浏览器,指示浏览器本身解释您传递的 XSLT。您可以使这些步骤中的每一个都尽可能动态,并使用缓存来提高性能,自定义以匹配浏览器或读者特征等等。

应用程序的这种多样性使得供应商文献难以阅读。我们都采用不同的 Java 编程风格,具体取决于我们是在处理 applet、servlet、bean 等,即使所有这些都符合 Java Web 软件的标签。同样,重要的是要清楚地了解不同产品提供哪种 XSLT 处理。

复杂的站点开发

尼尔·马登 (Neil Madden) 是诺丁汉大学的一名本科生,他拥有一个 XSLT 系统,该系统经过调整,可以实现特别快速的部署和维护。他的方案围绕多节站点组织,由管理员、编辑和用户团队编写。他使用 TclKit,这是一种创新的开源工具,它在一个特别轻量级、低维护的包中结合了数据库和 HTTP 功能。TclKit 也知道如何解释 Tcl 程序,因此他将 tDOM 与标准模板一起包装到一个可编写脚本的模块中。有了这个,他开始了特定于站点的开发

  1. 设计一个 XML 文档结构,以捕获站点数据的内容。

  2. 编写 XSL 样式表以转换数据以满足每个客户的需求。

  3. 为每个需要特殊要求的节重复步骤一和步骤二。

  4. 添加用户、节和页面。

脚本化文档封装了这些不同类型的数据包(站点结构、XML 源、样式表),并使将工作站点更新和部署到新服务器或分区变得容易。马登计划不仅提供基于 Web 的编辑,还提供更丰富、更快速的 GUI 界面。Tcl 的统一性和可脚本性使通过 Web 服务或本地 GUI 进行双端口移植成为可能。

明确定义的模块边界对于系统至关重要。设计人员维护样式表,管理员管理权限,编辑分配节而不会发生冲突。由于所有功能都作为将可靠组件粘合在一起的小脚本实现,因此很容易在上面分层新功能。马登的中期目标包括 Wiki 协作公告板,以及用于生成高质量演示输出的 XSP 和 FOP 模块。马登自豪地将他的系统与著名的、基于 Apache 的、Java 编码的 XML 发布框架 Cocoon 进行比较。他的系统以少量代码行数大幅超越了 Cocoon 的性能。

MediaOne 的 George J. Schlitz 在 tDOM XSLT 的生产使用方面更进一步。他在关键任务型 Web 环境中使用 XSLT 准备财务文档。虽然他最初开始使用 Xalan 发布,但性能要求促使他切换到 tDOM。

这一切的根本点是要注意 XML 编码或可 XML 编码的数据。聊天记录、法律记录、打印机作业、新闻照片、屏幕布局、族谱记录、游戏状态、应用程序设计、包裹运输、医疗文件等等都是 XML 化的候选对象。一旦采用这种格式,XSLT 处理通常是将数据呈现为特定用途的最可靠和可扩展的方式。

学习 XSLT

作为一种职业,我们仍然有很多关于 XSLT 的知识需要学习。尽管它的使用正在快速扩展,但精通 XSLT 的程序员仍然比 Object Pascal 等语言的程序员少。

XSLT 传播的另一个障碍是其非常规的基于 XML 的语法和令人困惑的部署,以及其函数式或应用语义。Linux Journal 中出现的大多数计算语言或多或少都是过程式的:Java 和 C 程序指示处理器执行一个操作,然后执行另一个操作,然后再执行另一个操作。过程式主义包含在计算的“如何”中。

XSLT 在其功能上与 Lisp 相关。好的 XSLT 程序表达了所需结果的“什么”。XSLT 不是关注时间顺序,而是对整个 XML 文档或格式良好的片段进行操作以产生结果。这被称为函数式(以唤起数学模型),其中函数将输入转换为输出,而没有副作用或随时间的变化。此外,数学函数可以组合(堆叠)。典型的 XSLT 语义表达了几个不同的转换,而没有指定它们的时间顺序。样式表同时应用。

XSLT 有变量,但它们是不可变的。它们只能接收一个值,尤其不能像在

for (i = 0; i < 10; i++);

中那样循环。参数化或重复操作通过显式递归和迭代完成。XSLT 变量使用的语法相当难看,因为它必须符合 XML 的约束。在 C 或 Java 中,我们可以编写

if (level > 20)
    code = 3;
else
    code = 5;
为了在 XSLT 中近似,我们需要
<xsl:variable name = "code">
     <xsl:choose>
         <xsl:when test = "$level &gt; 20">
             <xsl:text>3</xsl:text>
         </xsl:when>
         <xsl:otherwise>
             <xsl:text>5</xsl:text>
         </xsl:otherwise>
     </xsl:choose
</xsl:variable>
这些练习表明,虽然 XSLT 具有足够的抽象能力来自行处理一般问题,但它通常最好以双编程模式使用。XSLT 的优势通常在于模板处理、模式匹配以及 XML 元素的排序和分组。Zveno Pty. Ltd. 咨询公司的负责人 Steve Ball 尽可能多地使用 XSLT,然后将其嵌入到具有另一种语言的应用程序中,以处理与外部系统(包括文件系统和用户视图)的接口。

在我过去六个月遇到的开发人员中,最受欢迎的是 Java 和 Tcl,尽管 Python、C、Perl 和其他合作伙伴语言也或多或少地充分管理 XSLT 引擎。此外,XSLT 还定义了可扩展机制,允许开发人员在 XSLT 中提供新的语义:“扩展元素”、“扩展函数”和“回退处理”。

XSLT 的最终命运仍不清楚。在这方面,它也有点像 Java。五年前,Java 的目的似乎是构建可爱的可视化 applet。正如我们此后发现的那样,重型企业服务器实际上是最好的 Java 编程的更好宿主。我们仍处于决定何时使用 XSLT 的早期阶段。例如,ReportLab, Inc. 是一家企业供应商,它向世界上最大的组织(包括 Fidelity Investments 和 American Insurance Group)交付与高质量报告生成相关的产品和服务。ReportLab 的创始人 Andy Robinson 向我解释了他的开发团队在转换 XML 的项目中的深刻经验。他公司完成的每个项目都涉及使用更轻量级的脚本语言进行编码,而不是依赖 XSLT。即使 XSLT 专门用于 XML 转换,他的咨询团队也发现使用 Python 作为一种更通用的但功能强大的语言更容易。

致谢

特别感谢 Rolf Ade,他为 tDOM 软件做出了贡献,尤其是在我理解它方面。

如何开始 XSLT 编程

XSLT 学习

资源

XSLT 术语表

XSLT Powers a New Wave of Web Applications
电子邮件:claird@starbase.neosoft.com

Cameron Laird 是一位全职开发人员,也是 Phaseit, Inc. 的副总裁。他还经常撰写有关编程主题的文章,并且去年发表了几篇关于 XSLT 的文章。他目前正在准备一门关于该语言的培训课程。

加载 Disqus 评论