我有一个递归数据结构,基本上是一棵树,其中一个节点可能有子节点等等。我正在尝试生成该结构的类似 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 速度文档指出该#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
结构。