Freemarker - 替换&与&

时间:2012-12-06 18:31:20

标签: freemarker

如果我在某个字段中有&符号(来自数据库,无法更改),我想通过freemarker显示这个...但是显示(来自freemarker)读取{{1}这样做的方法是什么?

重申一下,我不能事先改变价值(至少,我不想),我希望freemarker能够“取消标记”&。

要重复迭代,这是一个使用其他xml的 lot 放置的值。值本身单独显示,由标签包围......所以类似

&

因此,我不希望所有&符号被转义,或者xml看起来很有趣......只是插值中的那个。

2 个答案:

答案 0 :(得分:2)

噢,善良。

我看到了问题:代码是这样编写的:

<#escape x as x?xml>
<#import "small.ftl" as my>
<@my.macro1/>
</#escape>

并且我假设excape会超越其中的所有调用 - 这肯定是文档的含义

http://freemarker.org/docs/ref_directive_escape.html

<#assign x = "<test>"> m1>
  m1: ${x}
</#macro>
<#escape x as x?html>
  <#macro m2>m2: ${x}</#macro>
  ${x}
  <@m1/>
</#escape>
${x}
<@m2/>      
  

输出将是:

&lt;test&gt;
m1: <test>
<test>
m2: &lt;test&gt;

然而,当您导入文件时,似乎不是这种情况,并且转义......逃脱!

解: http://watchitlater.com/blog/2011/10/default-html-escape-using-freemarker/

以上链接详细说明了如何解决问题。实际上,它归结为加载一个不同的FreemakerLoader,一个用转义标记包装所有模板。

class SomeCoolClass implements TemplateLoader {
    //other functions here
    @Override  
    public Reader getReader(Object templateSource, String encoding) throws IOException {  
        Reader reader = delegate.getReader(templateSource, encoding);  
        try {  
            String templateText = IOUtils.toString(reader);  
            return new StringReader(ESCAPE_PREFIX + templateText + ESCAPE_SUFFIX);  
        } finally {  
            IOUtils.closeQuietly(reader);  
        }  
    }  

这是上面链接的摘录。使用现有的templateLoader创建类,并将所有必需的方法推迟到该。

答案 1 :(得分:2)

从FreeMarker 2.3.24开始,不再需要TemplateLoader“hack”。有一个名为output_format的设置,它指定是否需要转义和转义。可以使用template_configurations设置全局配置和/或按模板名称模式配置。这样做的推荐方法更简单(来自手册):

  

[...]如果   recognize_standard_file_extensions设置为true(即{。}}   默认情况下,incompatible_improvements设置为2.3.24或   更高),源名称以“.ftlh”结尾的模板获取“HTML”   输出格式,以及“.ftlx”获取“XML”输出格式