【问题标题】:Use Freemarker macro call within string parameter of another macro在另一个宏的字符串参数中使用 Freemarker 宏调用
【发布时间】:2015-08-01 16:29:31
【问题描述】:

我有一个宏 A 可以格式化一些文本 <#macro A text>...${text}...</#macro> 和另一个具有接受文本参数的宏 <#macro B x>Another ${x} text</#macro>

我想用 x 参数调用 B 为一些由 A, s.th 格式化的文本。像 <@B x="<@A text='abc'/>" /> 返回Another <@A text='abc'/>

这有可能吗?

我尝试将?interpret 设置为suggested here by ddekany - <@B x="<@A text='abc'/>"?interpret /> 但这失败并出现错误:

这里需要一个字符串、日期或数字,Expression .... 是 取而代之的是 freemarker.core.Interpret$TemplateProcessorModel

似乎 FreeMarker 中的宏调用与其他语言中的函数调用有所不同。

【问题讨论】:

    标签: macros freemarker


    【解决方案1】:

    宏调用不是表达式,因此不能在表达式内部使用(如参数值)。调用宏是因为它们的副作用,通常打印到输出,并且没有返回值。函数(请参阅#function)因其返回值而被调用,因此函数调用是表达式。因此,在这种情况下,您可能需要函数,而不是宏。

    但是,如果您绝对必须在表达式(或任意模板片段)中使用宏调用的输出,那么您必须通过<#assign someVar>...</#assign><#local someVar>...</#local> 捕获输出。 (注意#escape。如果你用${...}重新打印捕获的输出,它将再次被转义,所以你需要#noescape。)

    【讨论】:

    • 感谢您的帮助,我忘记了函数...反正 FreeMarker 绝对是一门非常酷的语言 ;-)
    【解决方案2】:

    我找到了使用 assign 的解决方法:

    <#assign a><@A text="abc"/></#assign> <@B text=a/>

    无论如何,知道这是否可能会很有趣。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多