Freemarker模板中innerNode对应else子句未执行问题求助
问题根因
你代码中的判断条件逻辑错误:你当前写的innerNode?size != 0是尝试获取innerNode节点对象本身的长度,而非你实际想要判断的innerNode.children子节点集合的长度。同理外层的outerNode?size !=0也存在相同的逻辑错误。
因为innerNode是你自定义的Java节点对象,只有当该对象本身实现了对应返回集合长度的size()方法时,这个判断才会符合你的预期,否则该判断的返回结果和子节点集合是否为空完全无关,自然无法触发对应else分支。
修复方案
把两个层级的判断条件都替换为对应子节点集合的长度判断即可:
<dyxml:root> <#list nodes as outerNode> <dyxml:node id="${outerNode.getNodeId()}" name="${outerNode.title}"> <!-- 修正为判断outerNode的children集合长度 --> <#if outerNode.children?size !=0> <#list outerNode.children as innerNode> <dyxml:node id="${innerNode.getNodeId()}" name="${innerNode.title}"> <!-- 修正为判断innerNode的children集合长度 --> <#if innerNode.children?size !=0> <#list innerNode.children as grandChildNode> <dyxml:node id="${grandChildNode.getNodeId()}" name="${grandChildNode.title}"> <dyxml:${grandChildNode.href.getDyxmlRefType()} href="../${grandChildNode.href.getPath()}" tid="${grandChildNode.href.id}" version="${grandChildNode.href.version}" xml:lang="${grandChildNode.href.xmlLang}"/> </dyxml:node> </#list> <#else> <dyxml:${innerNode.href.getDyxmlRefType()} href="../${innerNode.href.getPath()}" tid="${innerNode.href.id}" version="${innerNode.href.version}" xml:lang="${innerNode.href.xmlLang}"/> </#if> </dyxml:node> </#list> <#else> <dyxml:${outerNode.href.getDyxmlRefType()} href="../${outerNode.href.getPath()}" tid="${outerNode.href.id}" version="${outerNode.href.version}" xml:lang="${outerNode.href.xmlLang}"/> </#if> </dyxml:node> </#list> </dyxml:root>
补充优化建议
可以额外增加非空判断,避免子节点集合为null时模板渲染报错:
<!-- 先判断children是否存在,再判断是否有内容,兼容性更好 --> <#if outerNode.children?? && outerNode.children?has_content>
内容的提问来源于stack exchange,提问作者Edmund Fitzgerald
相关产品推荐
相关产品推荐

