【问题标题】:Assigning empty string if XML node doesn't exist in Freemarker如果 Freemarker 中不存在 XML 节点,则分配空字符串
【发布时间】:2019-02-02 17:50:12
【问题描述】:

我有一个 XML 文档作为根传递给 Freemarker 模板。我希望将此 XML 中的一些值作为字符串分配给变量,然后将它们连接/打印出来。

<#assign MyVar = root.child1.child2.child3.mynode>

这里的问题是,即使路径不存在MyVar 也被分配了一个序列+散列,无法打印出来或转换为字符串。尽管此变量为 ?has_content 返回 false,但它需要一个额外的步骤来进行这些检查,而且我对许多变量以及跨模板文件和模块都有同样的问题。

我能找到的唯一解决方案是

<#assign MyVar = root.child1.child2.child3.mynode>
<#assign MyVar = MyVar ?has_content?then(MyVar , "")>

我正在寻找类似 @​​987654321@ 的东西,它还检查像 ?has_content 这样的空值。

Freemarker 是否提供任何更简单的单行函数来检查变量是否没有内容并为其分配默认值?

【问题讨论】:

    标签: freemarker


    【解决方案1】:

    简而言之:

    <#assign myVar = root.child1.child2.child3.mynode[0]!''>
    

    如果隐含的多类型默认值不会导致问题(例如当您使用 ${} 打印它时),则只需 &lt;#assign myVar = root.child1.child2.child3.mynode[0]!&gt;

    为什么:XML 查询(就像 XPath 查询一样)总是返回一系列匹配的节点。可能有 0 个这样的节点(或 1 个,或多个)。根据模板语言,空序列不是“缺失值”。这是与 XML 数据模型不匹配的不便之处。但是虽然序列始终存在,但它的第一个元素 ([0]) 不存在,因此您可以像往常一样使用所有缺失值处理运算符。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多