Freemarker 模板 else 子句没有被执行

Posted

技术标签:

【中文标题】Freemarker 模板 else 子句没有被执行【英文标题】:Freemarker Template else clause not getting executed 【发布时间】:2021-11-07 03:57:47 【问题描述】:

我正在使用 freemarker 模板引擎来创建 dyxml 包结构。在 Java 中,正在创建一个使用 ftl 呈现的树结构。我的 ftl 文件中有以下代码 -

    <dyxml:root>
        <#list nodes as outerNode>
        <dyxml:node id="$outerNode.getNodeId()" name="$outerNode.title">
            <#if outerNode?size !=0>
                <#list outerNode.children as innerNode>
                <dyxml:node id="$innerNode.getNodeId()" name="$innerNode.title">
                    <#if innerNode?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>

当 innerNode.children 的大小大于 0 时,将执行用于显示 grandChildNodes 的嵌套列表。但是,在 innerNode.children 大小为 0 的情况下,相应的 else 部分永远不会被执行。在创建的 xml 文件中没有呈现以下 else -

<#else>
    <dyxml:$innerNode.href.getDyxmlRefType() href="../$innerNode.href.getPath()" tid="$innerNode.href.id" version="$innerNode.href.version" xml:lang="$innerNode.href.xmlLang"/>
</#if>

我已调试数据并验证了 innerNode.children 为 0 的情况,else 部分应该理想地执行。请让我知道我可能会错过什么。谢谢。

【问题讨论】:

与您的问题无关,但请注意,您可以而且应该简单地写innerNode.href.dyxmlRefType,而不是innerNode.href.getDyxmlRefType() 【参考方案1】:

问题肯定是#if 条件使用outerNode?size 而不是outerNode.children?size,而您列出的是outerNode.children

【讨论】:

以上是关于Freemarker 模板 else 子句没有被执行的主要内容,如果未能解决你的问题,请参考以下文章

java 用freemark的好处

Apache freemarker 模板分配和比较值

使用freemarker模板时用到的一些语法

freemarker如何遍历模板中所有变量

如何编写没有输入参数的 FreeMarker 模板函数

没有 else 子句的单行 If 条件 [重复]