(1)准备借阅书籍介绍页面的内容。在制作 XML 文档之前,需明确文档要包含的数据 内容,才能进一步规划或设计 XML 文档等。该页面包含的内容如下:
借阅书籍介绍
书名: Ajax 基础教程
作者: (美)阿斯利森·舒塔
出版社: 人民邮电出版社
出版时间: 2006 年 02 月
ISBN: ISBN:7-115-14481-8/TP·5211
定价: 35.00 元
内容简介:
Ajax 技术可以提供高度交互的 Web 应用,给予用户更丰富的页面浏览体验。本书 重点介绍 Ajax 及相关的工具和技术,主要内容包括 XMLHttpRequest 对象及其属 性和方法、发送请求和处理响应、构建完备的 Ajax 开发工具、使用 JsUnit 测试 JavaScript、分析 JavaScript 调试工具和技术,以及 Ajax 开发模式和框架等。本书 中所有例子的代码都可以从 Apress 网站本书主页的源代码(Source Code)免费得 到。本书适合各层次 Web 应用开发人员和网页设计人员阅读
精彩导读: 书籍介绍页面的 XML 源文档,以“Book4-3.xml”文件名保存。
<?xml version="1.0" encoding="gb2312"?>
<Book>
<abstract> Ajax 技术可以提供高度交互的 Web 应用,给予用户更丰富的页面浏览体验。本书重点 介绍 Ajax 及相关的工具和技术,主要内容包括 XMLHttpRequest 对象及其属性和方法、发送请求和处理 响应、构建完备的 Ajax 开发工具、使用 JsUnit 测试 JavaScript、分析 JavaScript 调试工具和技术,以及 Ajax 开发模式和框架等。本书中所有例子的代码都可以从 Apress 网站本书主页的源代码(Source Code)
免费得到。本书适合各层次 Web 应用开发人员和网页设计人员阅读。
</abstract>
<comment> 几年前开始构建 Web 应用时,我们感觉这简直就是软件开发的“圣杯”。以前,我
们一直开发的都是胖客户应用,公司每次发布这种公司应用的新版本时,总是需要将这种应用部署到分 散在全国各地的数百个用户那里去,让我们沮丧的是,这种复杂的安装过程不仅冗长而且很容易出错,
不仅让开发人员很头疼,用户也非常不满。通过浏览器来部署应用,这看上去相当不错,因为这样,就 不再需要在客户端上安装软件了。所以,与许多其他公司一样,我们公司也很快转型,开始在 Web 上部 署应用。 尽管部署起来相对容易,但 Web 应用也有自己的问题。在用户看来,最突出的问题是用户界 面没有了以往丰富的交互性。Web 应用仅限于使用 HTML 提供的一组基本部件,而这是很有限的。更 糟糕的是,与服务器交互需要完全刷新页面,很多用户已经熟悉了功能强大的客户—服务器应用,对他 们来说,这一点很让人不快。我们曾经一直认为,在 Web 应用中只要刷新页面就必须完全刷新,好像这 是在所难免的,所以往往想方设法地避免页面刷新。我们甚至还考虑过编写一个 Java applet,由它处理 浏览器和服务器之间的通信。不过,随着越来越多 Web 应用的部署,我们很快发现,用户已经习惯了这 种完全页面刷新的方式,这么一来,我们也不再那么强烈地想要另辟蹊径了。……
</comment>
</Book>
(3)用 IE 浏览“Book4-3.xml”文件,结果如图 4-11 所示。
图 4-11 “Book4-3.xml”文件的浏览效果
(4)编写借阅书籍介绍页面的 XSL 样式表,编写的代码如下,并以“Book4-3.xsl”为文 件名进行保存。
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<xsl:template match="/">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>借阅书籍介绍</title>
</head>
<body>
<h2 align="center"><strong>借阅书籍介绍</strong></h2>
<table border="1" align="center">
<tr>
</td>
</tr>
<tr>
<td >内容简介:</td>
<td>
<xsl:value-of select="Book/abstract"/>
</td>
</tr>
<tr>
<td >精彩导读:</td>
<td>
<xsl:value-of select="Book/comment"/>
</td>
</tr>
<tr>
<td >本书目录:</td>
<td>…… </td>
</tr>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
(5)在 XML 文件中添加 XSL 样式表链接。在“Book4-3.xml”的第二行添加如下代码:
<?xml-stylesheet type="text/xsl" href="Book4-3.xsl" ?>
保存后用 IE 浏览得到如图 4-10 所示的最终效果。
四、知识要点分解
(一)匹配节点的模式
xsl:template 元素的 match 特性支持复杂的语法,允许人们精确地表达想要或不想要与哪 个节点匹配。xsl:apply-templates、xsl:value-of、xsl:for-each、xsl:copy-of 和 xsl:sort 的 select 属 性支持功能更加强大的语法的超集,允许人们精确地表达想要或不想要选择哪个节点。下面讨 论匹配和选择节点的各种模式。
1.匹配根节点
为了使输出的文档结构整洁。从 XSL 变换的第一个输出内容应为输出文档的根元素。因 此,XSL 样式单一般以应用于根节点的规则开始。要在规则中指定根节点,可将其 match 属 性设置为合适的值。例如:
<xsl:template match="/">
<html>
<xsl:apply-templates/>
</html>
</xsl:template>
此规则应用于根节点,并且只应用于输入树形结构的根节点。当读取到此根节点时,就 输出<html>标记,处理根节点的子节点,然后输出</html>标记。本规则推翻了根节点的缺省 规则。清单 4-5 显示了应用于根节点的带有单一规则的样式单。
清单 4-5 用于根节点的带有单一规则的 XSL 样式单
<?xml version="1.0"?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/XSL/Transform/1.0">
<xsl:template match="/">
<html>
<head>
<title>Atomic Number vs. Atomic Weight</title>
</head>
<body>
<table>
Atom data will go here
</table>
</body>
</html >
</xsl:template>
</xsl:stylesheet>
由于本样式单只为根节点提供一条规则,并且由于规则的模板未指明对子节点进行进一 步的处理,因而只是按原样输出,所以在模板中所看到的所有内容都将插入到结果文档中。换 句话说,将清单 4-5 中的样式单应用于清单 4-1(或其他任何结构整洁的 XML 文档)中,所 获得的结果如下:
<html><head><title>Atomic Number vs. Atomic Weight</title></head><body><table>
Atom data will go here
</table></body></html>
2.匹配元素名
正如前面介绍的那样,最基本的模式只包含一个元素名,用来匹配所有带有该名的元素。
例如,下面的模板与“ATOM”元素相匹配,并将“ATOM”元素的“ATOMIC_NUMBER”
子元素标成粗体。
<xsl:template match="ATOM">
<b><xsl:value-of select="ATOMIC_NUMBER"/><b>
</xsl:template>
清单 4-6 显示的是扩充了清单 4-5 的样式单。首先,在根节点的规则模板中包括了 xsl:apply-templates 元素。此规则使用 select 属性来确保只有“PERIODIC_TABLE”元素获得 处理。
其次,使用 match=“PERIODIC_TABLE”语句创建了只适用于“PERIODIC_TABLE”元 素的规则。本规则设置周期表(PERIODIC_TABLE)的标题,然后应用模板来从“ATOM”
元素中生成周期表(PERIODIC_TABLE)的主体。
最后,“ATOM”使用<xsl:apply-templates select="NAME"/>、<xsl:apply-templates select=
"ATOMIC_NUMBER"/>和<xsl:apply templates select="ATOMIC_WEIGHT"/>规则,明确地选择
“ATOM”元素的“NAME”、“ATOMIC_NUMBER”和“ATOMIC_WEIGHT”子元素。它 们都包装在 HTML 的 tr 和 td 元素中,以便最终的结果是与原子量(ATOMIC_NUMBER)
相匹配的原子(ATOM)序数表。图 4-12 显示将清单 4-6 中的样式单应用于清单 4-1 的输 出结果。
对本样式单需要注意的是:输入文档中的 NAME、ATOMIC_NUMBER 和 ATOMIC_
WEIGHT 元素的精确顺序是不重要的。它们在输出文档中以选择它们的顺序出现,也就是说 首先为原子序数,然后是原子量。相反,在输入文档中,各个原子依字母顺序排序。以后,将 会看到如何使用 xsl:sort 元素来改变这个顺序,以便使用更常规的原子序数的顺序来排列原子。
清单 4-6 select 用于元素的特定类的模板
<?xml version="1.0"?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/XSL/Transform/1.0">
<xsl:template match="/">
<html>
<head>
<title>Atomic Number vs. Atomic Weight</title>
</head>
<body>
<xsl:apply-templates select="PERIODIC_TABLE"/>
</body>
</html>
</xsl:template>
<xsl:template match="PERIODIC_TABLE">
<hl>Atomic Number vs. Atomic Weight</hl>
<table>
<th>Element</th>
<th>Atomic Number</th>
<th>Atomic Weight</th>
<xsl:apply-templates select="ATOM"/>
</table>
</xsl:template>
<xsl:template match="ATOM">
<tr>
<td><xsl:value-of select="NAME"/></td>
<td><xsl:value-of select="ATOMIC_NUMBER"/></td>
<td><xsl:value-of select="ATOMIC_WEIGHT"/></td>
</tr>
</xsl:template>
</xsl:stylesheet>
3.使用“/”符号匹配子节点
在 match 属性中并不局限于当前节点的子节点,可使用“/”符号来匹配指定的元素后代。
当单独使用“/”符号时,它表示引用根节点。但是,在两个名称之间使用此符号时,表示第 二个是第一个的子代。例如,“ATOM/NAME”引用“NAME”元素,“NAME”元素为“ATOM”
元素的子元素。
图 4-12 显示的原子序数与原子量的关系表
在 xsl:template 元素中,这种方法能够用来只与某些给定类型的元素进行匹配。例如,下 面的模板规则将“ATOM”子元素的“SYMBOL”元素标记为“strong”。此规则与非 ATOM 元素的直系子元素的“SYMBOL”元素无关。
<xsl:template match="ATOM/SYMBOL">
<strong><xsl:value-of select="."/></strong>
</xsl:template>
请记住,本规则选择的是作为“ATOM”元素子元素的“SYMBOL”元素,
而不是选择拥有 SYMBOL 子元素的 ATOM 元素。换句话说,在<xsl:value-of select="."/>中的“.”符号引用的是“SYMBOL”,而不是“ATOM”。
将模式写成一行的形式,就可以指定更深层的匹配。例如,PERIODIC_TABLE / ATOM / NAME 选择的是其父为“ATOM”元素(其父为 PERIODIC_TABLE 元素)的 NAME 元素。
还可以使用“*”通配符来代替层次结构中的任意元素名。例如,下面的模板规则应用于
“PERIODIC_TABLE”孙元素的所有 SYMBOL 元素。
<xsl:template match="PERIODIC_TABLE/*/SYMBOL">
<strong><xsl:value-of select="."/></strong>
</xsl:template>
最后一点,就如上面所看到的那样,单独使用“/”本身,表示选择文档的根节点。例如,
下面的规则应用于文档根元素的所有“PERIODIC_TABLE”元素。
<xsl:template match="/PERIODIC_TABLE">
<html><xsl:apply templates/></html>
</xsl:template>
虽然“/”引用根节点,但“/*”则引用任意根元素。例如,
<xsl:template match="/*">
<html>
<head>
<title>Atomic Number vs. Atomic Weight</title>
</head>
<body>
<xsl:apply-templates/>
</body>
</html>
</xsl:template>
4.使用“//”符号匹配子代
有时候,尤其是使用不规则的层次时,更容易的方法就是越过中间节点,只选择给定类
有时候,尤其是使用不规则的层次时,更容易的方法就是越过中间节点,只选择给定类