十年以前,当 XSLT 还是一个相对较新的技术时,我费了很大努力才理解它的使用方法。它的使用和调试都很难。然而,当我理解了 XSLT 的优点和缺点 — 特别是 — 它的范例、如何使用及何时使用之后,XLST 现在成为我很乐意使用的一个工具。如果应用于处理恰当的任务时,XSLT 非常好用且非常强大。
您是否曾经使用一个锤子和螺丝刀来卸下一个螺母?您可以用螺丝刀顶住螺母一边,然后用锤子敲打螺丝刀把手。然后在螺母转动时松开螺栓。如果螺母没有转动,那就加大敲击力度。现在设想一下使用一个套筒扳手。它与锤子有一点点像,但是用起来比真正的锤子麻烦一些。那么,放下锤子和螺丝刀,将套筒扳手放到螺母上拧动。但是,由于套筒扳手太大,您握起来很不顺手。最后,您放弃了这个工具,还是用回原来的锤子。
成功使用套筒扳手的关键在于模式匹配:套筒扳手必须与螺母相匹配。如果匹配,那么用套筒扳手来拧开一个螺母肯定比用锤子方便。XSLT
也依赖于模式:它是一种模式匹配语言,而 Java™ 和 C#
语言是命令式语言。如果 XSLY 是一个套筒扳手,那么命令式语言就是锤子。每一种语言均有其适用的地方。
Web 开发需要掌握几种差别很大的语言。当然,首先就是 HTML — 一种标记语言。然后,要在前端使用 CSS
和 JavaScript;服务器脚本语言,如 PHP 或 Microsoft® ASP.NET;以及后台语言,如 Java、C# 或
Microsoft Visual Basic.NET。最后,在数据库层还要使用 SQL。如果您了解 SQL,那么 XSLT 就更容易学习,因为这两种语言都是声明性语言。
如果您和大多数程序员一样,那么您一定是从像 C++
的命令式语言开始您的编程生涯的。这些语言是按命令及执行操作的函数进行编码的。它们的名称都是采用动词-名词
的形式 — 例如,GetValue 或
UpdateContactInfo。声明性语言很少关于发出指令的,而更多是关于陈述(或声明)预期的输出。表 1
显示了几种常见的命令式或声明式编程语言。
表 1. 编程语言风格
| 命令式 | 声明式 | ||
|---|---|---|---|
| 过程 | 面向对象 | 功能性 | 逻辑性 |
C、Pascal | Java、C++ | LISP、XPath | Prolog、SQL、XSLT |
XSLT 是声明性语言,用于实现 XML 到 XML、HTML 或普通文本的转换。这种转换是通过输入 XML 中选择输出内容模板的模式匹配实现的。其中的关键就是模式匹配,如 图 1 所示。您不需要编写命令,需要编写的是模式。有一些模式是匹配输入的,而有一些模式是作为输出模板的。
清单 1 显示的是一个简单的用于匹配 <item> 元素的 XSLT 模板。
清单 1. XSLT 模板示例
<xsl:template match="item">
<li><a href="{link}"><xsl:value-of select="title"/></a></li>
</xsl:template>
|
match 属性规定了匹配输入的模式 — 在这个例子中是一个 <item>
标签。<xsl:template> 标签之间的标记代码是输入模板。在清单 1 中,<link>
元素的值是 href 属性的 URL,而
<title> 元素的值是超链接的显示文本。
通常,开发人员会得到一个任务,如 “将这个 RSS 提要作为一个超链接列表显示”。图 1 显示了如何设想最终产品的外观。
图 1. 渲染的输出结果
但是,现在就开始编写代码的话您会遇到不小的困难,就像使用套筒扳手拧大小不合适的螺母一样。在您开始编写代码之前,一定要先弄清楚两个问题:
- 我有什么(输入)?
- 我要什么(输出)?
对于输入,可以考虑以下几点:
- XML 是什么样的?
- 元素有哪些?
- 哪些是可重复的?
- 结构是什么样的?
- 属性有哪些?
- 命名空间有哪些?
图 2 显示的是 XML 结构中常见的术语。
图 2. 常见的 XML 术语
要先获取一个 XML 输入示例。如果可能,也获取一个模式。这个模式提供了关于所有可能的标签、属性值和 XML 文档结构(可能的元素和属性)的信息。这个输入文档示例对于编写匹配模式及测试和调试您的 XSLT 是非常重要的。例如,可以考虑使用 清单 2 所示的 IBM® developerWorks® 技术库 RSS 提要。
清单 2. XML 输入文档示例
<?xml version="1.0"?> <rss version="2.0"> <channel> <title>IBM developerWorks : Technical library</title> <link>http://www.ibm.com/developerworks/</link> <description>The latest content from IBM developerWorks</description> <pubDate>27 Nov 2010 16:48:48 +0000</pubDate> <language>en</language> <copyright>Copyright 2004 IBM Corporation.</copyright> <image> <title>developerWorks</title> <url>http://www.ibm.com/developerworks/i/dwlogo-small.gif</url> <link>http://www.ibm.com/developerworks/</link> </image> <item> <title><![CDATA[IBM Cognos Proven Practices: Enterprise Planning - User Lockdown in DB2]]></title> <description><![CDATA[This document describes methods to limit database permission in DB2 for IBM Cognos Planning 8.]]></description> <link><![CDATA[http://www.ibm.com/developerworks/data/ library/cognos/infrastructure/databases/page535.html?ca=drs-]]></link> <pubDate>25 Nov 2010 05:00:00 +0000</pubDate> </item> <item> <title><![CDATA[Monitoring in DB2 9.7, Part 2: Relational access to XML event monitor data in DB2 9.7]]></title> <description><![CDATA[Learn how you can get relational access to the subset of monitor data that is captured in the form of an XML document by an activity or statistics event monitor in IBM DB2 for Linux, UNIX, and Windows Version 9.7 (DB2).]]></description> <link><![CDATA[http://www.ibm.com/developerworks/data/ library/techarticle/dm-1011db2mpart2/index.html?ca=drs-]]></link> <pubDate>24 Nov 2010 05:00:00 +0000</pubDate> </item> </channel> </rss> |
在很好地理解您的输入之后,您就可以考虑您希望得到的最终产品了。您可以考虑以下问题:
- 输出的格式是什么(XML、HTML 或是文本)?
- 标签名称和属性是什么?
- 结构是什么样的?
XSLT 能够将一个或多个 XML 文档转换成以下一种格式:
- HTML
- XML,采用不同的词汇表
- XML,采用相同的词汇表(使用相同的模板)
- XHTML(特殊要求的 XML)
- XSLT(XSLT 是一个 XML 词汇表,但是要求使用命名空间别名)
- 文本(例如,JavaScript)
在设计输出结果时,要从它的外观构想开始,然后再进一步修改其代码。例如,清单 3 所示的超链接列表的 HTML 代码。
清单 3. 预期的输出
<html> <head><title>the title</title></head> <body> <ul> <li><a href="some-url">hyperlink text</a></li> <li><a href="some-url">hyperlink text</a></li> </ul> </body> </html> |
在确定输入和输出之后,您就可以编写 XSLT 了。如果大多数时间您都是编写普通编程语言,那么您可能会想:“好,我先编写头部,然后写一个
for 循环生成列表,然后再编写底部。” 而没有考虑到模式问题。
输入元素 <item> 是与输出元素
<li> 相匹配的。在每一个
<item> 元素中,<link>
元素都会匹配
<a href> 属性,而
<title> 元素则匹配
<a> 标签之间的内容。现在您就可以创建这个 XSLT 了。以下是操作步骤:
- 输出结果是 HTML,所以要加入
<xsl:output>元素来规定 HTML。 - 添加根模板 — 即
<xsl:template match="/">— 填入 HTML 的模式,包括头部和底部。 - 将
<xsl:apply-templates>元素置于列表所在的位置。 - 编写一个模板,匹配
<item>元素,将其输出到<li>元素中。
清单 4 显示了完整的 XSLT。
清单 4. 完整的 XSLT
<?xml version='1.0'?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html"/>
<xsl:template match="/">
<html>
<head><title>Zen of XSLT</title></head>
<body>
<ul>
<xsl:apply-templates select="rss/channel/item"/>
</ul>
</body>
</html>
</xsl:template>
<xsl:template match="item">
<li><a href="{link}"><xsl:value-of select="title"/></a></li>
</xsl:template>
<xsl:template match="text()"/>
</xsl:stylesheet>
|
编写 XSLT 考虑的重点是模式匹配,而不是函数调用。必须弄清楚两个问题:
- 我有什么?
- 我要什么?
在弄清这些问题之后,您就可以编写 XSLT 模板来匹配输入和输出了。否则,您可能感觉到像用锤子一样使用一个套筒扳手来敲击螺丝刀手柄而拧开螺栓的螺母。
学习
- XML 新手入门:获取学习 XML 的资源。
- Extensible Stylesheet Language Transformations (XSLT) 作者:W3C(developerWorks,2007 年 4 月):了解更多关于 XSLT 的信息。
- XSLT 是什么类型的语言?(Michael Kay,developerWorks,2005 年 4 月):通过学习这个语言的来源、优点和用途而了解 XSLT。
- XSLT 处理程序是如何工作的(Benoît Marchal,developerWorks,2004 年 3 月):比较 XSLT 与 JSP、PHP 和其他的 Web 开发语言。
- XML Path Language (XPath) 作者:W3C(developerWorks,2007 年 4 月):了解更多关于 XPath 标准的信息。
- Putting XSL transformations to work(Mark Colan,developerWorks,2001 年 10 月):了解几种可受益于 XSL 转换的真实业务场景。
- 技巧:如何用 XSLT 组合文档(Benoît Marchal,developerWorks,2003 年 5 月):了解 XPath 功能及如何使用 XSLT 组合文档。
-
developerWorks XML 专区:在 XML 专区获取提高您的专业技能所需的资源。
-
developerWorks 中文社区:个性化您的 developerWorks 体验。
-
IBM XML 认证:了解如何才能成为一名 IBM 认证的 XML 和相关技术的开发人员。
-
XML 技术库:访问
developerWorks XML 专区,获得广泛的技术文章和技巧、教程、标准和 IBM 红皮书。此外,阅读更多的
>XML 技巧文章。
-
developerWorks 技术活动 和 网络广播:随时关注这些活动中的技术。
- developerWorks 播客:收听面向软件开发人员的有趣访谈和讨论。
- developerWorks 演示中心,观看并了解 IBM 及开源技术和产品功能。
获得产品和技术
-
IBM 产品评估试用版软件:下载或
IBM SOA Sandbox for People,并开始使用来自
DB2®、Lotus®、Rational®、Tivoli® 和 WebSphere® 的应用程序开发工具和中间件产品。
讨论
- XML 专区讨论论坛:参与任何一个 XML 相关讨论。
-
developerWorks 中文社区。查看开发人员推动的博客、论坛、组和 wikis,并与其他 developerWorks 用户交流。
Doug Domeny 使用 XSLT、W3C XML Schema、DHTML、JavaScript、jQuery、正则表达式和 CSS 编写开发了基于浏览器的、多语言的、对业务用户友好的 XML 编辑器。他持有韦纳姆戈登学院的计算机科学和数学学士学位,曾多年服务于 OASIS 技术委员会,比如 XML Localization Interchange File Format (XLIFF) 和 Open Architecture for XML Authoring and Localization (OAXAL)。在作为软件工程师期间,他发展了在软件工程设计和架构、UI 设计和技术写作方面的重要技能。