在另一个宏的字符串参数中使用 Freemarker 宏调用

Ped*_* T. 5 macros freemarker

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

我想用 x 参数调用 B,使其成为 A 格式化的一些文本。喜欢 <@B x="<@A text='abc'/>" />退货Another <@A text='abc'/>

这有可能吗?

按照 ddekany 的?interpret建议尝试了- 但这失败并出现错误:<@B x="<@A text='abc'/>"?interpret />

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

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

dde*_*any 6

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

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