我遇到了freemarker模板的一个小问题 - 或者更有可能是我的设置。
基本上,我有两套模板:
常用模板,集中了一些我非常希望集中在一个文件中的文本块。
输出格式,可生成HTML
,XML
,纯文本等,并且可能包含一些常见的文本块。
到目前为止,我没有使用ftlx
/ ftlh
自动转义模式 - 每个模板都是“普通”ftl
文件。由于我的输出格式可能是XML
等,我在我的输出格式模板的output_format="XML"
指令中设置ftl
等,以便生成XML
。< / p>
不幸的是,output_format
仅对当前模板有效,而不适用于所包含的模板,这会导致未转义的特殊字符(<
,&
等常见嫌疑人)我呈现的XML
。另一方面,这种行为非常有意义,因为包含的模板可能会声明自己的output_format
。
有没有办法逃脱包含的模板或覆盖output_format
包含的模板?或者我是否必须复制所有目标转义模式(XML
,HTML
,纯文本等)的文本块模板?
非常感谢提前!
答案 0 :(得分:0)
模板中某个部分的输出格式已经确定,并且在解析模板时(不是以后,当它被执行时)变得固定,因此无法动态分配。如果模板是#include
- d或它是主模板,则不会生成任何内容。因此,如果您在包含的&#34;文本块模板&#34;中进行了插值,那么您肯定会遇到问题。如果那里没有插值,那么它就不会进行插补,因为静态文本无论如何都不会被转义。
我们假设您在那些&#34;文本块模板&#34;中进行了插值。一个(公认的尴尬)解决方法可能是使用&#34; undefined&#34;这些模板的输出格式,然后在其中使用#escape
之类的遗留#escape x as esc(x)
,其中esc
是要使用的转义函数,您可以动态分配。 (函数/方法是FTL中的第一类值,因此您可以将它们分配给变量。因此您可以发布<#assign esc = someEscapingFunction>
,然后#include
模板。)当然,您需要创建一些宏和函数做这个可管理的。就像你创建一个名为setDynamicOutputFormat
的宏,它以某种方式根据其参数输出格式设置所述esc
变量,然后你启动一个典型的模板:<#ftl outputFormat='HTML'><@setDynamicOutputFormat .outputFormat />
。然后,当您#include
某事时,#escape x as esc(x)
将在其中正常运作。