大多数人都希望 Saxon 这样的 XSLT 处理程序能使用多个输入文件。常常会遇到这样的问题,需要将一个目录中的 XML 文件转换成 HTML。可以对这些文件分别使用 Saxon,但是如果最后希望生成一个文件包含所有那些 HTML 文件的索引,那该怎么办呢?
您需要的是目录列表的 XML 版本。这样就可以将这个 XML 文件作为 XSLT 的惟一输入文件,并用 XSLT 处理每个文件。如果 XSLT 能够直接进行目录处理就很完美了。不幸的是,尽管 XSLT 很强大,特别是 XSLT 2.0,但这种语言却没有目录操作。
HXDLG 来帮忙!
在网上冲浪的时候,我从 SourceForge 上发现了一个不起眼的小 Java 程序,HTML/XML Directory List Generator (HXDLG)(请参阅 参考资料)。HXDLG 的一项功能就是创建目录列表的 HTML 或 XML 表示。我下载了该工具,并从命令行运行清单 1 所示的语句。
清单 1. 使用 HXDLG 创建 XML 目录的代码
java -jar hdlg.jar XML
/Users/jherr/Projects/ibm_xml_tips/filelist/testfiles/
/Users/jherr/Projects/ibm_xml_tips/filelist/files.xml
这个程序有三个参数。第一个参数是输出类型,即 XML 或者 HTML。第二个是目录路径,第三个是输出 XML 文件的路径。结果如清单 2 所示。
清单 2. XML 格式的目录
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hdlg:filesystem SYSTEM
"http://www.hdlg.info/XML/filesystem.dtd">
<hdlg:filesystem
xmlns:hdlg="http://www.hdlg.info/XML/filesystem">
<hdlg:folder name="testfiles"
url="file:/Users/jherr/Projects/ibm_xml_tips/filelist/testfiles/">
<hdlg:file name="test1.xml" size="179"
type="unknown"
url="file:/ibm_xml_tips/filelist/testfiles/test1.xml">
</hdlg:file>
<hdlg:file name="test2.xml" size="181"
type="unknown"
url="file:/ibm_xml_tips/filelist/testfiles/test2.xml">
</hdlg:file>
<hdlg:file name="test3.xml" size="181"
type="unknown"
url="file:/ibm_xml_tips/filelist/testfiles/test3.xml">
</hdlg:file>
</hdlg:folder>
</hdlg:filesystem>