技巧:XSLT 秘诀

关于编写 XSLT 的基础问题

一开始编写 XSLT 代码是有些难度的,但是如果您理解了两个简单的问题,那么您就找到了正确的方法。通过本文所介绍的简单方法,很快您就能够更清晰地理解转换的基础概念。

Doug Domeny, 高级软件工程师, Freelance

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 设计和技术写作方面的重要技能。



2011 年 3 月 14 日

十年以前,当 XSLT 还是一个相对较新的技术时,我费了很大努力才理解它的使用方法。它的使用和调试都很难。然而,当我理解了 XSLT 的优点和缺点 — 特别是 — 它的范例、如何使用及何时使用之后,XLST 现在成为我很乐意使用的一个工具。如果应用于处理恰当的任务时,XSLT 非常好用且非常强大。

常用缩写词

  • CSS:层叠样式表
  • HTML:超文本标记语言
  • RSS:简易信息聚合
  • SQL:结构化查询语言
  • URL:统一资源定位符
  • W3C:世界万维网联盟
  • XHTML:可扩展超文本标记语言
  • XML:可扩展标记语言
  • XSLT:可扩展样式表语言转换

您是否曾经使用一个锤子和螺丝刀来卸下一个螺母?您可以用螺丝刀顶住螺母一边,然后用锤子敲打螺丝刀把手。然后在螺母转动时松开螺栓。如果螺母没有转动,那就加大敲击力度。现在设想一下使用一个套筒扳手。它与锤子有一点点像,但是用起来比真正的锤子麻烦一些。那么,放下锤子和螺丝刀,将套筒扳手放到螺母上拧动。但是,由于套筒扳手太大,您握起来很不顺手。最后,您放弃了这个工具,还是用回原来的锤子。

成功使用套筒扳手的关键在于模式匹配:套筒扳手必须与螺母相匹配。如果匹配,那么用套筒扳手来拧开一个螺母肯定比用锤子方便。XSLT 也依赖于模式:它是一种模式匹配语言,而 Java™ 和 C# 语言是命令式语言。如果 XSLY 是一个套筒扳手,那么命令式语言就是锤子。每一种语言均有其适用的地方。

XSLT 是一种编程语言

Web 开发需要掌握几种差别很大的语言。当然,首先就是 HTML — 一种标记语言。然后,要在前端使用 CSS 和 JavaScript;服务器脚本语言,如 PHP 或 Microsoft® ASP.NET;以及后台语言,如 Java、C# 或 Microsoft Visual Basic.NET。最后,在数据库层还要使用 SQL。如果您了解 SQL,那么 XSLT 就更容易学习,因为这两种语言都是声明性语言。

如果您和大多数程序员一样,那么您一定是从像 C++ 的命令式语言开始您的编程生涯的。这些语言是按命令及执行操作的函数进行编码的。它们的名称都是采用动词-名词 的形式 — 例如,GetValueUpdateContactInfo。声明性语言很少关于发出指令的,而更多是关于陈述(或声明)预期的输出。表 1 显示了几种常见的命令式或声明式编程语言。

表 1. 编程语言风格
命令式声明式
过程面向对象功能性逻辑性
C、PascalJava、C++LISP、XPathProlog、SQL、XSLT

XSLY 的秘诀:模式匹配

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. 渲染的输出结果
渲染的显示超链接列表的 HTML 输出

但是,现在就开始编写代码的话您会遇到不小的困难,就像使用套筒扳手拧大小不合适的螺母一样。在您开始编写代码之前,一定要先弄清楚两个问题:

  • 我有什么(输入)?
  • 我要什么(输出)?

确定任务的输入

对于输入,可以考虑以下几点:

  • XML 是什么样的?
  • 元素有哪些?
  • 哪些是可重复的?
  • 结构是什么样的?
  • 属性有哪些?
  • 命名空间有哪些?

图 2 显示的是 XML 结构中常见的术语。

图 2. 常见的 XML 术语
一个 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

在确定输入和输出之后,您就可以编写 XSLT 了。如果大多数时间您都是编写普通编程语言,那么您可能会想:“好,我先编写头部,然后写一个 for 循环生成列表,然后再编写底部。” 而没有考虑到模式问题。 输入元素 <item> 是与输出元素 <li> 相匹配的。在每一个 <item> 元素中,<link> 元素都会匹配 <a href> 属性,而 <title> 元素则匹配 <a> 标签之间的内容。现在您就可以创建这个 XSLT 了。以下是操作步骤:

  1. 输出结果是 HTML,所以要加入 <xsl:output> 元素来规定 HTML。
  2. 添加根模板 — 即 <xsl:template match="/">— 填入 HTML 的模式,包括头部和底部。
  3. <xsl:apply-templates> 元素置于列表所在的位置。
  4. 编写一个模板,匹配 <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 模板来匹配输入和输出了。否则,您可能感觉到像用锤子一样使用一个套筒扳手来敲击螺丝刀手柄而拧开螺栓的螺母。

参考资料

学习

获得产品和技术

讨论

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=XML, Web development
ArticleID=632206
ArticleTitle=技巧:XSLT 秘诀
publish-date=03142011