http://bbs.w3china.org/dispbbs.asp?boardID=23&ID=12041
技巧: 将 RTF 文档转换成 HTML 文档
XML 是将现有的 RTF 格式(Rich Text Format)文档转换成 HTML 以在 Web 上显示的理想媒介。这篇技巧文章说明了如何使用 Java 应用程序 MajiX 将 RTF 文档转换成 XML 格式(虽然有一些限制)。 从中,您可以容易地用XSLT将 XML 文档转换成适合于浏览器的 HTML 格式。代码样本演示了这些技术,可下载的源代码包含了用于转换的 servlet 容器。
我发现使用 XML 是将旧的 RTF 格式(Rich Text Format)文档转换成 HTML 的最快方法。我决定将 MajiX 软件包作为最方便的方法使用。
什么是 MajiX?
MajiX 是由 TetraSix 开发的一种开放源码软件包(遵守 Mozilla Public License 1.1),用于 MS Word 到 XML 的转换。 它将 RTF 文档转换成 XML。如果要遵循这篇技巧文章中的说明,请立即从 http://tetrasys.dhs.org/ 下载 MajiX。
准确地讲,MajiX 使用什么样的 XML 标记来表示 RTF 文档呢?MajiX 有两个现成的转换模板:mydoc 和 sdocbook。
mydoc 模板使用 MajiX 专有的 XML 标记来表示 RTF,例如:
清单 1. MajiX 的 mydoc XML 格式
.
.
.
<mydoc>
<p><b>Lord of the Rings</b></p>
.
.
.
</mydoc>
在该示例中,<mydoc>、<info> 和 <author> 等标记都是 MajiX 专有的 XML 标记。
sdocbook 模板使用 Simplified DocBook 标记(请参阅参考资料)。Simplified DocBook 是广受欢迎的 DocBook 元素的子集,DocBook 在全球范围内被用于编写文章和书籍。例如,Linux Documentation Project 使用 DocBook 来编写 Linux 文档。DocBook 是由“结构化信息标准促进组织”(Organization for Advancement of Structured Information Standard (OASIS))维护的。
清单 2 显示了一个缩略的 sdocbook 标记示例。
清单 2. sdocbook XML 格式
.
.
.
<article>
<para><emphasis>Lord of the Rings</emphasis></para>
.
.
.
</article>
比较清单 1 和 清单 2 时注意,mydoc XML 和 sdocbook XML 使用不同的方法来表示同一个文档。
这时,MajiX 可能会提示您一些选项。当您有一个奇怪的 RTF 标记(在 sdocbook XML 中,MajiX 没有它的等价标记)时, 会出现这个提示。一般单击缺省值就可以了。
现在,转换 RTF 文档的第一部分已经完成。结果是带 sdocbook 标记的 XML 文档。
第 2 步:将 XML 转换成 HTML
要将 XML 输出转换成 HTML,需要一个 XML 转换引擎(XSLT 处理器),如 Xalan、XP 或 Saxon。对于这次演示,我使用 Xalan。XSLT 处理器把 XML 文档作为输入,并根据某些转换规则生成一个新的 XML 文档。 这把我们带到下一个需求:转换规则。因为我们的目的是根据 sdocbook XML 生成 HTML 文档(请参阅侧栏的 HTML 是 XML),所以需要说明如何将 sdocbook 中的元素映射成 HTML 等价标记的转换规则。
XSL 样式表包含这样一些转换规则。基本上(使用上面的示例),输入文件是清单 2, 输出文件将是生成的 HTML 文件。XSL 样式表需要指示 XML 转换引擎做的事情之一是:将 <html> 标记添加到生成文档的开始和末尾。 转换规则还在生成的 HTML 文档中用 <p> ... </p> 将输入文件中 <para> ... </para> 内的文本括起来,等等。简而言之,sdocbook 标记将转换成相应的 HTML 标记。下面显示了根据 sdocbook XML 生成的 HTML:
清单 3. 根据 sdocbook XML 生成的 HTML
.
.
.
<html>
<p><b>Lord of the Rings</b></p>
.
.
.
</html>
此时,您可能觉得很兴奋,并推断您总是可以编写转换规则,将 sdocbook XML 文档转换成其它格式,如 PDF、UNIX 帮助页面等其它类似的格式。您是对的!这正是 XML 文档与 XSL 样式表的功能相结合的美妙之处。
因为 DocBook XML 对于文档编写是如此的流行,所以可以轻易地得到要执行转换的样式表并不稀奇。 从 http://sourceforge.net/project/showfiles.php?group_id=21935 下载它们。文件在 docbook-xsl-<version> 中。这篇技巧文章所用的是 4.1.2。如果您打算遵循本文中的技巧,那么现在就安装样式表。
要将 sdocbook XML 转换成 HTML,输入清单 4 中的命令。请注意,必须完整地输入该命令。 在清单 4 中,我将它分成几行,只是让它适合便携式电脑屏幕。
清单 4. 将 sdocbook XML 转换成 HTML 的命令(将它输入在一行中)
java -classpath
<xalan install path>\bin\xalan.jar;
<xalan install path>\bin\xerces.jar
org.apache.xalan.xslt.Process
-IN <input file>
-OUT <output file>
-XSL <location of docbook.xsl>
用浏览器打开输出文件 ...!
实时将 XML 转换成 HTML
到目前为止,我已经演示了如何将 RTF 文档转换成 HTML 文档。一旦有了 HTML 输出,就可将它们存储在 Web 服务器, 以便通过 Web 访问它们。然而,这意味着每次更改 sdocbook 文档,都必须重新生成 HTML。 或者,可以设置自动生成 DocBook 文档的 HTML 文档,以响应每次 Web 请求。但是,这种动态生成可能会给您的服务器添加巨大的负载。 便利与性能相比 ... 或许答案是进行高速缓存?请您自己来判定,因为其自身就是一篇独立文章。
要实时生成 HTML 文档,需要一个 Web 服务器和一个 servlet 容器。光有 Web 服务器只能够提供静态 HTML 页面的服务。servlet 扩展了其能力。它可以处理传递到 Web 服务器的参数并根据传入的参数实时生成一个 HTML 页面。 简而言之,servlet 能够使 Web 服务器完全象 CGI 程序那样提供动态 HTML 页面的服务。
您可以从几乎无止境的 Web 服务器和 servlet 容器组合中进行选择,当然也包括 IBM 的 WebSphere Application Server。Jakarta Tomcat servlet 容器(请参阅参考资料)是用于测试这个技巧的一个开放源码选项:它是与内部 Web 服务器一起提供的 servlet 容器。缺省情况下,它在 8080 上侦听。
“参考资料”中提供了执行从 sdocbook XML 到 HTML 转换的 servlet 代码。我将简要地说明一下清单 5 中最重要的代码部分。
让我们注意一下清单 5 中用数字标记的蓝色行:
设置由 Web 服务器返回给 Web 浏览器的文档类型。在这一情况下是 HTML,因为我打算将 sdocbook XML 转换成 HTML。
将 servlet 的输出设置为到 Web 浏览器的响应流。
设置将传入 Xalan 转换程序的 XML 源。这是源文档(sdocbook XML)。它将使用从浏览器传递来的文件参数来构成 sdocbook XML 的文件名。
设置 XSL 源,它包含有关 Xalan 将如何执行转换的规则。这是 XSL 样式表;将它设置为存储样式表的位置。
使用您在标记为 4 的行中定义的 XSL 样式表来创建 Xalan 转换程序。
执行转换并将结果发送到响应流。
结束语
MajiX 向您提供了一种将 RTF 文档转换成 sdocbook XML 格式的快捷方式。而且,XSLT 处理器(如 Xalan)可以将产生的 sdocbook XML 重新格式化成 HTML,以便可以从 Web 访问它们。