我有一个递归数据结构,基本上是一棵树,其中一个节点可能有子节点等等。我正在尝试生成该结构的类似JSON的文件。为此,考虑使用#parse
指令。在上下文中,我存储根节点,并在templateName中存储模板的名称。
{
"name" = "$node.name",
"value" = "$node.value"
#if ($node.childrens.size() > 0)
,
"childrens" = {
#foreach ($child in $node.childrens)
## The next statement does not work
#parse ($child.type + ".vm", $child)
#end
}
#end
}
Apache Velocity文档指出#parse
指令只接受一个参数。
在一些例子中,我们可以看到在调用另一个模板之前使用了#set
指令,但是如果树的深度超过2,这将不起作用,因为在#set
指令中使用的变量存储在相同的上下文中,所以当从深度1到2时,该变量将被覆盖。
使用#parse
而不是@Sergiu Dumitriu建议的宏的原因是每个节点可能根据其属性$node.type
以不同的方式呈现。我希望针对每种类型都有一个模板,这样添加特定类型的模板的人就不必干扰任何其他模板。我的意思是,也许可以通过type属性上的开关来实现这一点;但这意味着所有呈现方式都将在同一个文件中定义。
是否有办法使用Velocity将模板应用于递归数据结构?
解决方案根据Sergiu Dumitriu的两个答案,最终模板如下:
#macro ( displayNode $node)
{
#set ( $parseNode = $node )
#set ( $parseTemplate = $parseNode.type + ".vm" )
#parse ( $parseTemplate )
#set ( $parseNode = $node )
#set ( $parseTemplate = "Common.vm" )
#parse ( $parseTemplate )
}
#end
Common.vm
的结构如问题中所示。
#parse
。这在问题中并没有明确说明,所以我已经更新以反映这一事实。 - Javier Mr#parse
之前的#set
,所以最终的解决方案是两者的混合。 - Javier Mr