【问题标题】:Apache freemarker template assign and compare valuesApache freemarker 模板分配和比较值
【发布时间】:2021-11-17 13:28:30
【问题描述】:

我正在使用下面的赋值语句为变量 i_type 赋值。

<#assign i_type>  
<#if x.has("type")>
    <#if x.type == "ABC">"ABC"<#else>"${x.type?lower_case}"</#if>
<#else>"pqr"</#if>
</#assign>

那我想在ftl转换中赋值一个变量为:

"final_type" : <#if i_type?has_content && i_type == "pqr">1<#else>0</#if>

但在所有情况下,final_type 的值始终为 0。 我明确打印了 i_type 的值,即使它是“pqr”,但条件总是为假。

应该改变什么?

【问题讨论】:

    标签: freemarker


    【解决方案1】:

    为什么原始示例不起作用是因为您在 &lt;#else&gt;"pqr"&lt;/#if&gt; 和其他类似位置有引号。这样捕获的值本身将包含引号,因为 FreeMarker 指令的嵌套内容不是表达式,而是就像顶级模板内容一样。所以就写&lt;#else&gt;pqr&lt;/#if&gt;

    无论如何,写下你所做的事情的更好方法是:

    <#assign i_type =
       x.has("type")?then(
         (x.type == "ABC")?then(x.type, x.type?lower_case),
         "pqr"
       )
    >
    

    您也不需要第二段代码中的i_type?has_content 条件,因为总是将某些东西分配给i_type。 (但即使实际上并非如此,您也可以写 i_type! 以将缺失值默认为 ""。)所以可以这样写:

    "final_type" : ${(i_type == "pqr")?then("1", "0")}
    

    【讨论】:

    • 它有效。感谢您提供详细信息。
    • 如果答案有效,请也​​接受它(绿色复选标记)。
    【解决方案2】:

    我用过一次

    "final_type" : <#if i_type?has_content && i_type?eval == "pqr">1<#else>0</#if>
    

    效果很好。

    【讨论】:

    • 不要那样做。您调用?eval 只是为了删除您自己添加的引号。您可以不添加它们。
    猜你喜欢
    • 1970-01-01
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    • 2022-12-29
    • 2013-12-24
    • 1970-01-01
    • 2012-11-01
    • 1970-01-01
    相关资源
    最近更新 更多