我有一个宏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 />
但是这失败并出现错误:
在这里期待字符串,日期或数字,表达式....是 而是一个freemarker.core.Interpret $ TemplateProcessorModel
似乎FreeMarker中的宏调用与其他语言中的函数调用不同。
答案 0 :(得分:1)
宏调用不是表达式,因此不能在表达式内使用(如参数值)。调用宏的副作用通常是打印到输出,并且没有返回值。函数(参见<#assign someVar>...</#assign>
)的返回值被调用,因此函数调用是表达式。所以也许你需要功能,而不是这种情况下的宏。
但是如果您必须在表达式(或任意模板片段)中使用宏调用的输出,则必须通过<#local someVar>...</#local>
或#escape
捕获输出。 (请注意${...}
。如果您使用#noescape
重新打印捕获的输出,它将再次转义,因此您需要{{1}}。)
答案 1 :(得分:0)
我找到了使用assign的解决方法:
<#assign a><@A text="abc"/></#assign>
<@B text=a/>
无论如何,知道这是否有可能会很有趣。