将 FreeMarker 与 Ant 结合使用

我们知道两个“ FreeMarker Ant 任务”:

  • FreemarkerXmlTask:它随 FreeMarker 发行版一起提供,打包在freemarker.jar中。这是一个轻量级,易于使用的 Ant 任务,用于使用 FreeMarker 模板转换 XML 文档。它的方法是源文件(Importing 文件)是 XML 文件,它们通过单个模板呈现为相应的输出文件。也就是说,对于每个 XML 文件,将执行模板(数据模型中具有 XML 文档),并且模板输出将被写入与 XML 文件名相似的文件中。因此,模板文件起着与 XSLT 样式表相似的作用,但它是 FTL,而不是 XSLT。

  • FMPP:这是一个重量更重,以 XML 为中心的第三方 Ant 任务(和独立的命令行工具)。它的主要方法是源文件(Importing 文件)是模板文件,它们自身会生成相应的输出文件,但是对于 XML-s 的源文件,它也支持FreemarkerXmlTask的方法。此外,它还具有FreemarkerXmlTask之外的其他功能。那有什么缺点呢?由于它更复杂,更笼统,因此很难学习和使用它。

本节介绍FreemarkerXmlTask。有关 FMPP 的更多信息,请访问其主页:http://fmpp.sourceforge.net/

为了使用FreemarkerXmlTask,您必须首先在 Ant 构建文件中定义freemarker.ext.ant.FreemarkerXmlTask,然后调用该任务。假设您要使用假设的“ xml2html.ftl”模板将多个 XML 文档转换为 HTML,其中 XML 文档位于目录“ xml”中,而 HTML 文档生成到目录“ html”中。您将编写如下内容:

<taskdef name="freemarker" classname="freemarker.ext.ant.FreemarkerXmlTask">
  <classpath>
    <pathelement location="freemarker.jar" />
  </classpath>
</taskdef>
<mkdir dir="html" />
<freemarker basedir="xml" destdir="html" includes="**/*.xml" template="xml2html.ftl" />

该任务将为每个 XML 文档调用模板。每个文档都将解析为 DOM 树,然后包装为 FreeMarker 节点变量。当模板处理开始时,特殊变量.node被设置为 XML 文档的根节点。

请注意,如果您使用的是旧版(FreeMarker 2.2.x 和更早版本)XML 适配器实现,该适配器仍然有效,并且 XML 树的根作为变量document放置在数据模型中。包含旧版freemarker.ext.xml.NodeListModel类的实例。

请注意,构建文件定义的所有属性都将作为名为“ properties”的哈希模型提供。提供了其他几种模型;有关使模板可以使用哪些变量以及任务可以接受哪些其他属性的详细说明,请参阅 JavaDoc for freemarker.ext.ant.FreemarkerXmlTask