【问题标题】:Remove lines in Freemarker output删除 Freemarker 输出中的行
【发布时间】:2014-12-29 17:41:06
【问题描述】:

我正在使用 Freemarker 模板生成一个 odt 文件。

我的代码是:

${(addressline1)!}
${(addressline2)!}
${(addressline3)!}

问题是当 addresline1 或 addressline2 或为空时,它会生成一个空行。如果所有字段都为空,则会生成三个空行。

我尝试了以下方法:

  1. [#if addressline2??]${(addressline2)!} [/#if]

  2. [#if addressline2?has_content]${(addressline2)!} [/#if]

  3. 压缩指令

    [@compress] 
    ${(addressline1)!}
    ${(addressline2)!}
    ${(addressline3)!} [/@compress]
    

但似乎没有任何效果。

【问题讨论】:

  • 你解决了这个问题了吗?我有同样的问题。只有我使用word模板和XDocReport来生成pdf文件。

标签: freemarker


【解决方案1】:

诀窍是将起始 标记放在需要删除的行的前一行,如果为空。

${keep this line always}<#compress>
${remove this line if empty}</#compress>
${keep this line always}

适用于 freemarker 2.3.31

【讨论】:

    【解决方案2】:

    遇到了同样的问题。这就是我最终得到的结果:

    <#assign i2 = ""?left_pad(2*4)>
    <#assign i3 = ""?left_pad(3*4)>
    ...
            <#if dep.version??>${i3}<version>${dep.version}</version>${"\n"}</#if><#t>
    ...
    

    从我的错误报告中复制:

    我希望能够通过 1 行模板源代码有条件地生成 NEW LINE。

            <#if dep.classifier??><classifier>${dep.classifier}</classifier></#if>
    

    无论如何,这都会生成缩进空格和换行符。 {{#t}} 和 {{#rt}} 和 {{#lt}} 在编译时应用,因此它们不关心条件。因此,即使内容在那里,它们也会剥离,这是我不想要的。

    我可以这样做:

            <#if dep.classifier??>${"            "}<classifier>${dep.classifier}</classifier>${"\n"}</#if><#t>
    

    这就是请求。它也可以是任何有助于我实现这一目标的东西。

    在那之前,我必须这样做:

            <#if dep.classifier??>
            <classifier>${dep.classifier}</classifier>
            </#if>
    

    我不喜欢,因为它使模板变长了。

    或者

            <#if dep.classifier??><classifier>${dep.classifier}</classifier>
            </#if><#if dep.classifier??><classifier>${dep.classifier}</classifier>
            </#if>
            ...
    

    我不喜欢,因为它很乱。

    或者

             <#if dep.classifier??>${"         "}<classifier>${dep.classifier}</classifier>${"\n"}</#if><#t>
    

    我不喜欢,因为它在模板中添加了多余的部分。

    【讨论】:

      【解决方案3】:

      您是否在 OpenOffice/LibreOffice 或此类可视化编辑器中编辑模板?因为那么问题是虽然你只看到${something},FreeMarker 看到&lt;p&gt;${something}&lt;/p&gt;。因为它只是一个通用的模板文本引擎,所以当插入的文本为空时,它不会删除保留在那里的&lt;p&gt;&lt;/p&gt;。将它用于ODT 的应用程序应该提供一种清除空段落的方法。

      【讨论】:

      • 我看到生成的content.xml对应那个odt文件。它是

        ${(addressline1)!}

        。有什么方法可以删除这个正在添加的

      • 正如我所说,它超出了 FreeMarker 的范围。 p 只有在 ${...} 被 FreeMarker 解析后才能被删除,因为只有这样才能知道 p 是空的。或者,ODT 生成器工具应该提供其他移除封闭元素的方法。 (顺便说一句,这只是${addressline1!},不需要()
      【解决方案4】:

      您应该能够通过这样做来使其工作:

      <#if addressline1 !== ''>${addressline1}</#if>
      

      只需重复该过程即可检查所有 3 个变量。或者,如果它们不存在而不是它们只是空的,那么这段代码应该可以完成工作:

      <#if addressline1?exists>${addressline1}</#if>
      

      您可以在 Freemarker 手册网站上找到更多文档:http://freemarker.org/docs/index.html

      【讨论】:

        猜你喜欢
        • 2015-11-22
        • 2019-02-04
        • 2013-06-09
        • 1970-01-01
        • 1970-01-01
        • 2014-04-10
        • 1970-01-01
        • 2011-05-12
        • 1970-01-01
        相关资源
        最近更新 更多