设置 output_format 时 FreeMarker 模板中的 NonStringException

NonStringException in FreeMarker template when output_format is set

我有一个 FreeMarker 模板,我想在其中指定输出格式以转义 XML 文件中的某些字符。模板示例如下所示:

<#ftl output_format="XML">
<#assign field1>
   TestField&1&
</#assign>
<#assign field2>
   <#if field1?trim?length == 0>
      TestField&1&
   <#else>
      TestField&2&
   </#if>
</#assign>
<?xml version="1.0" encoding="UTF-8"?>
<FIELD2>${field2}</FIELD2>

转换工作正常(转义除外),除非我将 <#ftl output_format="XML"> 指令放入我的模板中。之后我得到一个 NonStringException:

freemarker.core.NonStringException: For "?trim" left-hand operand: Expected a string or something automatically convertible to string (number, date or boolean), but this has evaluated to a markup_output (wrapper: f.c.TemplateXMLOutputModel): ==> field1 [in template "Test.ftl" at line 6, column 9]

基本上 field1?trim?length 不起作用,因为 field1 不再被评估为字符串。

如果没有输出格式指令,一切都会按预期进行。
我使用的 FreeMarker 版本是 2.3.26-incubating.

要防止 XML 出现此错误 outputformat,您可以为 field1 分配字符串值:

<#ftl output_format="XML">
<#assign field1 ="TestField&1&"/>

您可以使用 markup_string 内置函数,returns 将标记存储在标记输出值中作为字符串。

<#ftl output_format="XML">
<#assign field1>
    TestField&1&
</#assign>
<#assign field2>
    <#if field1?markup_string?trim?length == 0>
        TestField&1&
    <#else>
        TestField&2&
    </#if>
</#assign>
<?xml version="1.0" encoding="UTF-8"?>
<FIELD2>${field2}</FIELD2>