级别: 初级 Benoit Marchal (bmarchal@pineapplesoft.com), 顾问, Pineapplesoft
2003 年 9 月 01 日 随着越来越多的开发人员学习和试用 XML,许多人开始对使用样式表发布和管理网站感兴趣。但是开始学习这种技术并非始终是一件轻松的事情。孤立地看,尽管没有一种概念是困难的,但是将这些概念紧密地结合在一起并非是轻而易举的事情。在本文中,Benoit Marchal 提供了循序渐进的指导以帮助您入门。他演示了如何在源、规则(样式表)和发布目录中组织您的项目。您还将获得有关 XML 编辑器的一些实用技巧。
通过本专栏的
论坛、各种邮件列表和我的咨询活动,我注意到人们对利用 XML 和 XSL 来管理和发布网站越来越感兴趣。尽管许多开发人员都熟悉 XML 和 XSL,但是构建一个一致的系统并不是件轻松的任务。在本文中,通过从头到尾完成一个实用的且循序渐进的示例,我为您介绍了如何用 XML 创建网站。
我将利用在本专栏中开发的工具 — 用于 Eclipse 的 XM 插件(XM plug-in for Eclipse)(请参阅
参考资料)来说明该技术。即使您使用的是另一个发布环境(例如 Apache Cocoon),本文提供的信息仍然是有用的,但我发现 XM 对用户更友好。
为什么使用 XML 和 XSL?
首先,我将研究一下利用 XML 进行发布的优点和代价。您将发现有很多理由,可以使我们转向使用 XML — 实际上,理由非常之多,因此无法在本文中对所有理由进行讨论。我只重点介绍了最常听到的一些原因:
-
它比较简单。刚开始时您可能不这样认为,因为您需要学习如此多的新工具,但是一旦您拥有了一个适当的 XML 解决方案,那么您的站点管理琐事将显著减少。
-
它不会过时(obsolescence-proof)。XML 将内容(文本和图像)与样式化工作和发布工作分离,这样您就可以对它们分别进行单独地更改。例如,当您编写新文档时,您可以专心于编写工作,而不必关心颜色、背景或导航。反过来,当您更改颜色、背景或导航时,XML 和 XSL 会自动更新您的所有页面。
-
它是一种开放标准。许多商业工具和开放源码工具都支持 XML。即使某个供应商“消失”了、放弃了某个产品,或者不支持您所需的特性,毋庸置疑的是肯定会有替代品。
-
它适应性很强。XML 文档就象微型数据库,而样式表就象脚本,它负责查询和操作来自那些文档数据库的数据。这些样式表十分灵活 — 从简单的发布到计算新内容(例如目录、索引及更多)都能胜任。
但是有哪些代价呢?您必须权衡考虑编写样式表的代价和优点。值得为使重复的任务自动化付出代价,但不能过头。如果您的站点只包含几个页面,那么不使用 XML 会更快且更廉价。当站点的页面达到 10 到 20 个时,那么 XML 才物有所值。
就个人而言,我喜欢 XML,因为它简化了站点管理。几年前,我必须利用常规的 HTML 编辑器来维护一个包含 100 多个页面的站点。相信我,那并不是件有趣的事情。对站点进行任何更改(例如添加或删除某些部分)都将花费数小时的时间来复制和粘贴链接。错误和坏链接是常有的事。
利用 XML 和 XSL 却不会发生这样的情况。相反,样式表使恼人的重复性任务自动化,从而节省了时间,并使错误最少。当然,XML 不是唯一的解决方案。某些编辑器提供了基于模板的方法,这种方法就象是 XML 和 XSL 的组合。我还喜欢 XSL,因为它是一种脚本语言(仅仅受到我想象力的限制),并且它不依赖于专有的解决方案。
您可以在服务器、客户机或 Web 管理员的桌面机器上使用样式表。用于 Eclipse 的 XM 插件在 Web 管理员的桌面机器上实现样式表 — 当处于批处理方式时,它还可以在服务器上工作。该插件自动创建一个静态网站(例如一些 HTML 页面),这些页面可上载到任何服务器。通过在 Web 管理员的桌面机器上使用样式表,可以进一步提高 XML 的灵活性,因为它与每个 Web 服务器和浏览器都兼容,这一点不同于其它方案。
 |
何时使用动态内容
尽管 XML 补充了 JSP,但它还是比不上 JSP。典型网站有 95% 的静态内容(例如 FAQ、图像和描述),而其余内容是比较动态的内容(例如论坛、搜索表单或购物车)。遇到静态内容时,XML 要优于 JSP,而 JSP 适用于比较动态的内容。
为了汲取这两种技术的长处,我通常通过 XML 和 XSL 生成 JSP 页面。再强调一次,其目的是将内容和发布工作区分开。要利用 XM 插件生成 JSP 页面而不是 HTML 页面,请将
xr:extension="jsp" 属性添加到
xsl:output 元素。
|
|
servlet、JSP、PHP 或 ASP 怎样呢?换而言之,动态生成的网站怎么样呢?许多商店已经转向动态托管,以获得同样的优点,并简化站点维护。servlet 或 JSP 页面中的代码负责显示。这与 XML 和 XSL 比起来如何呢?
简而言之,XML 更高效。动态站点往往比较慢,因为服务器要为每次请求计算页面。这些站点也比较难于设置和维护,遗憾的是,这通常会导致站点不大稳定。我知道,有许多方法可用来避免所有这些问题,但是您会发现 XML 只花了很小的代价就提供了更好的结果。
开始
开始之前,请下载 Eclipse 和用于 Eclipse 的 XM 插件(请参阅
参考资料以获取链接)。XM 是
“使用 XML(Working XML)”专栏的一个项目,它增强了 Eclipse,使它能够支持利用 XML 和 XSL 进行 Web 发布。XM 还可以作为适合于批处理的独立软件。为了准备这篇专栏文章,我使用了 Eclipse 2.1 和 XM 0.9。按照 Eclipse 和 XM 网站上的指导安装软件。
启动 Eclipse,然后单击
File > New菜单中的
Project。在打开的对话框(请参阅图 1)中,选择
ananas.org和
XM Project,然后单击
Next。输入项目名(例如
mysite ),然后单击
Finish。
图 1. 创建新项目
新项目出现在导航程序(Navigator)中。当您打开该项目时,您可以看到它包含三个目录:
publish 、
rules 和
src ,如图 2 所示。如果您未看到导航程序,请单击
Window > Show View菜单中的
Navigator。
图 2. 导航程序中的新项目
源目录
src (源)目录保存着您的 XML 文档以及图像和其它支持文件。该插件创建了一个样本文件以帮助您开始学习。您应当对它进行编辑以添加您自己的内容,并且根据需要添加其它 XML 文件。
src 目录中的每个 XML 文件都成为网站上的一个 HTML 页面。
XML 编辑器一节介绍了编写 XML 文档的工具。目前只在文本编辑器(例如 Eclipse)中打开 XML 文档。样本文档使用了 DocBook 的一个简化版本,带有以下标记:
-
article :文档的根
-
articleinfo :包含文献信息
-
sect1 :文档章节
-
sect1info :包含章节标题
-
title :可能会在
articleinfo 或
sect1info 下面作为一个标题出现
-
copyright :将版权信息保存为一个或多个
year 标记和一个
holder 标记
-
simpara :段落
-
ulink :超链接
 |
DTD 还是模式?
应当使用 DTD 还是模式呢?实际上,这并不十分重要。两者都根据给定的词汇表验证您的文档。与 DTD 相比,模式提供了更多控制,但模式引入的一些特性主要是针对电子商务的,这些新特性在发布应用程序方面不是很重要。由于新式的编辑器既可以很好地处理 DTD,也可以很好地处理模式,因此您可以根据自己的喜好选择使用 DTD 还是模式。
|
|
您可以使用其它标记,但是需要相应地编辑样式表。
正如我说过的,样本文档派生自 DocBook。但是,它使用了不同的名称空间来表明它不是真正的 DocBook。DocBook 是用于技术文档的标准词汇表。它最初是由 O'Reilly 开发的,并且是由 OASIS(XML 用户的国际协会)维护的。
您可能会发现 DocBook 是开始学习的一个较佳选择,因为它很容易就可得到,而且很有效,它是一种标准,并且它很流行(选择它主要因为它的流行)。上百种现有 XML 工具都可以处理 DocBook — 显然,市场上的工具越多,意味着您需要做的工作越少。
其它用于网站的流行 XML 词汇表包括:国际新闻通讯委员会(International Press and Telecommunication Council,IPTC)的 NewsML、Norman Walsh 的 Web 页面 DTD(Norman Walsh 还维护 DocBook 词汇表)和 Apache Cocoon DTD。
规则目录
rules 目录包含了样式表。大多数网站只需要一个样式表。用于 Eclipse 的 XM 插件将 default.xsl 样式表应用于每个文档,除非它被告知用其它样式表。因此,如果您的站点只有一个样式表,那么请将它保存为
rules/default.xsl 。如果您的站点需要多个样式表,将它们保存在
rules 下,并且将下面的处理指令添加到那些不使用缺省值的文档:
<?xml-stylesheet href="listing.xsl" type="text/xsl"?>
|
当心!该处理指令需要两个参数:
href 指向样式表(您可以只输入文件名 — XM 插件自动在
rules 目录下查找),而
type 的值必须为
text/xsl 。还请记住,该处理指令适用于文档(在
src 目录中),而不适用于样式表(在
rules 目录中)。
发布目录
最后(但并非最不重要的)一个目录是
publish ,插件在该目录中生成您的网站。下一步是将该目录中的内容上载到 Web 服务器。
另一个警告:决不要试图编辑或修改
publish 目录中的文件。如果对某个 Web 页面不满意,那么请更改 XML 文档(在
src 目录中)或样式表(在
rules 目录中),但是
决不要试图编辑
publish 目录中的任何内容。您的目的是使有关发布的琐事自动化 — 直接编辑站点与该目标是背道而驰的。此外,插件在下一次重新生成站点时,可能会覆盖您的更改。
改进站点
正如您在前一节中看到的,项目向导创建了一个样本站点。下一步是填充
src 目录,并改进样式表。如果您采用了流行的词汇表(例如 DocBook),您可以发现已经存在的样式表,它们可以加速这一过程。
XML 编辑器
 |
迁移
如果您正在从另一个发布工具进行迁移,可能无法一下子将您的内容转换成 XML。别担心 — 该插件能够发布出现在
src 目录中的任何 HTML 文件,因此您可以把它们逐步转换成 XML。
|
|
由于您必须编辑许多 XML 文档,所以值得“投资”一个好的 XML 编辑器。您的选择有:
-
文本编辑器,例如 Eclipse。文本编辑器适用于小型的修正工作,但对于复杂的编辑而言,它们太不方便了。
-
伪所见即所得 XML 编辑器,例如 XMetaL 或 XMLMind。这些编辑器模仿了字处理器,并且非常适用于复杂的编辑。
-
RTF 转换器。它们与字处理器一起工作以生成 XML,当您从许多不同的作者(他们可能不熟悉 XML)那里收集文档时,这些转换器非常理想。
哪种选择最好呢?这取决于手头上的作业。我发现几乎不可能利用文本编辑器编写长文档。必须记住要让开始和结束标记成对出现,这大大加重了我的工作量。除了最基本的修正工作外,大多数作者都不喜欢使用文本编辑器进行其它任何工作。
伪所见即所得编辑器提供了最舒适的环境,作者无须担心 XML 语法(请参阅图 3)。由于它们使用颜色、黑体字和其它排版属性来模仿能处理 XML 内容的字处理器,因此被称为“伪所见即所得”。如果您从未尝试过伪所见即所得编辑器,那么劳驾一下,请立即下载评估版本。请注意,这些编辑器并不是“开箱即可用的”— 必须根据给定的词汇表对其进行定制。幸运的是,大多数编辑器都提供了对 DocBook 的本机支持 — 这是采用这个流行词汇表的另一个原因。
最后一种解决方案是仍然使用您的字处理器,并使用 RTF 转换器生成 XML 文档。实际上,您会发现转换工作很少没有麻烦,但是如果您从不熟悉 XML 的作者那里收集文档,那么它是一个较佳的解决方案。在 Pineapplesoft,我们维护着一个社区网站,许多作者为该站点撰稿,我们对该网站广泛使用了转换器。
图 3. 伪所见即所得编辑器
超链接和 URL
作为一种额外的功能,用于 Eclipse 的 XM 插件对超链接进行管理以防止坏链接。该插件使用了所谓的
相对 URL(提供相对于当前文件的路径的 URL)。清单 1 显示了一个相对 URL 示例。
清单 1. 相对 URL
about.xml
photos/index.xml
../images/logo.gif
|
而
绝对 URL却相反,它包括主机名,或者提供从网站的根开始的路径。清单 2 显示了一个绝对 URL 示例。
清单 2. 绝对 URL
/photos/index.xml
http://www.ananas.org/
http://www.ibm.com/developerWorks
|
 |
相对 URL 和样式表
在样式表中使用相对 URL 很困难,因为这样的话 URL 必须相对于站点中的每个文档。但是 XM 插件提供了一种变通方法。如果一个 URL 以
! (感叹号)字符开头,那么则将其视作相对于网站的根。下面的路径说明了这一点:
在样式表中,应当让所有 URL 都以
! 开头。
|
|
您应当尽可能地使用相对超链接,因为 XM 插件:
- 根据需要更新文件扩展名,必要的时候将扩展名从
.xml 更改为
.html
- 测试链接,如果链接是坏的则发出警告
错误消息和故障诊断
该插件在 XM 控制台中报告有关 XML 文档或样式表的问题。如果未看到该控制台,那么请从
Window > Show View菜单选择
XM Console。请仔细阅读错误消息,因为它包含对问题的描述。该插件还列出发生错误的文件和行(而错误可能不止一行或两行,因此还请务必查阅问题前后的那些行)。
如果插件生成了空白 Web 页面,那么请:
- 仔细阅读 XM 控制台中的错误消息
- 确保对应的 XML 文档不为空
- 检查您的样式表是否适合于该文档词汇表,请特别注意名称空间
当某些内容看起来确实很怪异时,请复查名称空间和元素名称。在我的学生所遇到的所有问题中,名称空间不匹配占了其中的 25%。
Eclipse 技巧
我将以有关 XM 插件的几个技巧来结束本文。
从
Window菜单选择
Preferences。在 Workbench 类别下,选择 File Associations 项,并将
*.xml 和
*.xsl 文件与某个编辑器关联起来。可以与众多 Eclipse 文本编辑器中的某个进行关联,或使用外部编辑器(例如 XMLMind)。当您双击该文件时,它将自动打开所关联的编辑器。
要在打开文件时选择编辑器,那么在导航程序中用鼠标右键单击该文件,然后选择
Open with菜单。
当您在 Eclipse 中保存一个文档时,Eclipse 会自动生成网站。如果您使用的是一个外部编辑器(例如 XMLMind),那么请从
Project菜单选择
Rebuild Project。如果该菜单呈灰色,不可点击,那么请先在导航程序中单击该项目。
当 XM 插件重新构建网站时,它不能识别对样式表的更改。如果看上去该插件忽略您的更改,那么请执行下列步骤:
- 在导航程序中用鼠标右键单击项目名称(在上面的示例中为
mysite ),然后选择
Properties。
- 选择
XM Properties并确保
"RunXM" performs a build被选中(请参阅图 4)。
- 单击
OK。
- 再次用鼠标右键单击该项目,然后选择
"Run XM"。
图 4. 编辑特性
继续学习
我希望本文已让您相信这样一件事情:利用 XML 和 XSL 发布网站是有趣的,而且提供了许多优点。XSL 是一个功能强大的工具 — XM 插件进一步扩展了这种功能,所以在本文中我只能浅尝辄止。要学习更多有关所有可用功能的知识,建议您阅读
developerWorks上
使用 XML(Working XML)专栏中的以前文章。
在您下载该插件时,您会发现
ananas.org 项目的副本。那就是我用来维护站点的项目,它演示了许多高级功能。您可能还想研究该代码。最后,请务必加入
使用 XML(Working XML)论坛。
参考资料
关于作者
对本文的评价
|