我有一个XML文档作为根传递给Freemarker模板。我希望将此XML中的某些值作为字符串分配给变量,然后再连接/打印出来。
<#assign MyVar = root.child1.child2.child3.mynode>
这里的问题是,即使路径不存在,MyVar
也被分配了不能打印或转换为字符串的sequence + hash。尽管此变量对于?has_content
返回false,但需要执行额外的步骤进行这些检查,并且对于许多变量以及跨模板文件和模块,我也遇到相同的问题。
我唯一能找到的解决方案是
<#assign MyVar = root.child1.child2.child3.mynode>
<#assign MyVar = MyVar ?has_content?then(MyVar , "")>
我正在寻找类似Default Value Operator的东西,它还会检查诸如?has_content
这样的空值。
Freemarker是否提供任何更简单的单行函数来检查变量是否不包含内容并为其分配默认值?
答案 0 :(得分:0)
简而言之:
<#assign myVar = root.child1.child2.child3.mynode[0]!''>
或者如果隐式多类型默认值不会引起问题(例如,仅使用<#assign myVar = root.child1.child2.child3.mynode[0]!>
打印它时),就${}
。
为什么:XML查询(就像XPath查询一样)总是返回一系列匹配的节点。这样的节点可能有0个(或1个或多个)。根据模板语言,空序列不是“缺失值”。与XML数据模型不方便的不匹配。但是,尽管序列始终存在,但其第一个元素([0]
)不存在,因此您可以照常使用所有缺少的值处理程序运算符。