XSLT 实例

清单 1. 表示足球锦标赛结果的 XML 文档
<results group="A">
<match>
<date>10-Jun-1998</date>
<team score="2">Brazil</team>
<team score="1">Scotland</team>
</match>
<match>
<date>10-Jun-1998</date>
<team score="2">Morocco</team>
<team score="2">Norway</team>
</match>
<match>
<date>16-Jun-1998</date>
<team score="1">Scotland</team>
<team score="1">Norway</team>
</match>
<match>
<date>16-Jun-1998</date>
<team score="3">Brazil</team>
<team score="0">Morocco</team>
</match>
<match>
<date>23-Jun-1998</date>
<team score="1">Brazil</team>
<team score="2">Norway</team>
</match>
<match>
<date>23-Jun-1998</date>
<team score="0">Scotland</team>
<team score="3">Morocco</team>
</match>
</results>



清单 2. 足球赛结果的基本样式表
<xsl:transform
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="results">
<html>
<head><title>
Results of Group <xsl:value-of select="@group">
</title></head>
<body><h1>
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>
<p>Played on <xsl:value-of select="date"></p>
<p>Result:
<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/1999/XSL/Transform"
version="1.0">
<xsl:variable name="teams" select="//team[not(.=preceding::team)]">
<xsl:variable name="matches" select="//match">
<xsl:template match="results">
<html><body>
<h1>Results of Group <xsl:value-of select="@group"></h1>
<table cellpadding="5">
<tr>
<td>Team</td>
<td>Played</td>
<td>Won</td>
<td>Drawn</td>
<td>Lost</td>
<td>For</td>
<td>Against</td>
</tr>
<xsl:for-each select="$teams">
<xsl:variable name="this" select=".">
<xsl:variable name="played" select="count($matches[team=$this])">
<xsl:variable name="won"
select="count($matches[team[.=$this]/@score > team[.!=$this]/@score])">
<xsl:variable name="lost"
select="count($matches[team[.=$this]/@score < team[.!=$this]/@score])">
<xsl:variable name="drawn"
select="count($matches[team[.=$this]/@score = team[.!=$this]/@score])">
<xsl:variable name="for"
select="sum($matches/team[.=current()]/@score)">
<xsl:variable name="against"
select="sum($matches[team=current()]/team/@score) - $for">
<tr>
<td><xsl:value-of select="."></td>
<td><xsl:value-of select="$played"></td>
<td><xsl:value-of select="$won"></td>
<td><xsl:value-of select="$drawn"></td>
<td><xsl:value-of select="$lost"></td>
<td><xsl:value-of select="$for"></td>
<td><xsl:value-of select="$against"></td>
</tr>
</xsl:for-each>
</table>
</body></html>
</xsl:template>
</xsl:transform>



这里没有足够的篇幅来完整地说明这个样式表,简而言之,它为球队声明了一个变量,变量值是一个节点集合,其中每个参赛球队都有一个实例。然后它计算每支球队的胜、平或负的比赛场次总数,以及球队进球或失球的总数。图 3 显示了它在浏览器中的最终输出结果。


图 3. 清单 3 中名次样式表的结果


这个示例的目的是说明 XSLT 不单单能够对源文档中出现的文本指定字体和布局。它是一个完整的编程语言,能够以任何方式转换源数据以供显示,或者输入另一个应用程序。


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 与以前的编程语言有着本质的区别。但不要放弃:它是功能非常强大的技术,值得努力学习。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值