You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Freemarker:保留宏内标签空格,移除普通HTML标签间空格

解决Freemarker模板仅压缩常规HTML、保留宏内标签空格的问题

我需要处理Freemarker(FTL)模板,要求移除常规HTML标签之间的空格,但保留<#macro>宏内部HTML标签的空格。目前使用<#compress>指令会同时处理宏内内容,导致宏里的标签空格也被修改,求正确实现方案。

示例文件

People.ftl

<#macro people>
 <#include "address.ftl">
</#macro>

Address.ftl

...
....
<#macro>
  <div class="custom content">
 ${.node.@@text}
</div>
</#macro>
...
....

当前输出(宏内空格被错误压缩)

<div> <div> <p>From Address.ftl</p> </div> <div> <p>From Address.ftl</p> </div>
<div class="custom content"> <p>From macro Address.ftl. I have white space between sub tags <sub> </sub> like this </p> </div> </div>

期望输出(仅压缩常规HTML,宏内空格保留)

<div><div><p>From Address.ftl</p></div><div><p>From Address.ftl</p></div>
<div class="custom content"> <p>From macro Address.ftl. I have white space between sub tags <sub> </sub> like this </p> </div></div>

解决方案

方案1:局部使用<#compress>,仅包裹常规HTML

不要全局启用<#compress>,只把需要压缩的常规HTML代码块用<#compress>包裹,宏的定义和调用都放在这个块外面:

<#compress>
<!-- 这里是需要压缩的常规HTML -->
<div>
  <div>
    <p>From Address.ftl</p>
  </div>
  <div>
    <p>From Address.ftl</p>
  </div>
</#compress>

<!-- 宏调用不在compress块内,宏输出的内容会保留空格 -->
<@people />

这种方式下,常规HTML部分的标签空格会被压缩,宏内部的HTML空格完全保留。

方案2:全局启用<#compress>,宏内用<#nocompress>包裹

如果必须全局开启<#compress>(比如模板头部已添加该指令),可以在宏内部用<#nocompress>包裹需要保留空格的内容,跳过压缩处理:

修改Address.ftl中的宏:

<#macro>
<#nocompress>
  <div class="custom content">
 ${.node.@@text}
</div>
</#nocompress>
</#macro>

全局的<#compress>会处理常规HTML,而宏内被<#nocompress>包裹的内容会保留原有空格。


内容的提问来源于stack exchange,提问作者CodeJack

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 01:12:07