和Ant一起使用FreeMarker

我们现在知道有两种"FreeMarker Ant tasks":

  • FreemarkerXmlTask:它来自于FreeMarker的发布包, 打包到 freemarker.jar 中。 这是使用FreeMarker模板转换XML文档的轻量级的,易于使用的Ant任务。 它的入口源文件(输入文件)是XML文件,和生成的输出文件对应, 这是通过单独模板实现的。也就是说,对于每个XML文件, 模板会被执行(在数据模型中的XML文档), 模板的输出会被写入到一个和原XML文件名相似名称的文件中。 因此,模板文件扮演了一个和XSLT样式表相似的角色,但它是FTL,而不是XSLT。

  • FMPP:这是一个重量级的,以很少的XML为中心, 第三方Ant任务(和独立的命令行工具)。 它主要的目的是用作为模板文件的源文件(输入文件)生成它们自己对应的输出文件, 但它也对以XML为源文件的 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文档结点的根root。

请注意,如果你正使用遗留的(FreeMarker 2.2.x 和以前版本)XML适配器实现, 也同样可以进行,而且XML树的根结点被放置在数据模型中, 作为变量 document。它包含了遗留的 freemarker.ext.xml.NodeListModel 类的实例。

请注意,所有通过构建文件定义的属性将会作为名为"properties"的哈希表模型来用。 一些其他方法也会可用;对模板中什么样的可用变量的详细描述, 还有什么样的属性可以被任务接受,参见 freemarker.ext.ant.FreemarkerXmlTask 的JavaDoc文档。