如果 Freemarker 中不存在 XML 节点,则分配空字符串

Posted

技术标签:

【中文标题】如果 Freemarker 中不存在 XML 节点,则分配空字符串【英文标题】:Assigning empty string if XML node doesn't exist in Freemarker 【发布时间】: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 是否提供任何更简单的单行函数来检查变量是否没有内容并为其分配默认值?

【问题讨论】:

【参考方案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]) 不存在,因此您可以像往常一样使用所有缺失值处理运算符。

【讨论】:

以上是关于如果 Freemarker 中不存在 XML 节点,则分配空字符串的主要内容,如果未能解决你的问题,请参考以下文章

使用freemarker的嵌套xml标签遍历

AWS lambda:如果log4j.xml中不存在环境变量,有没有办法设置默认值?

如果存在,如何获取xml文件的子节点,否则使用php跳转到下一个节点

从 XML 文件中获取节点在 php 中不起作用

XML 命名空间中不存在标记

如果表中存在值,则在 freemarker/html 中打印表