Freemarker - <#if ??> 似乎无法识别空对象

Freemarker - <#if ??> doesn't seem to work in identifying null objects

我正在尝试使用 FreeMarker XML-XML 转换。 处理空对象的正确方法是什么。 (不是值而是空对象)

当输入 XML 中不存在 "AlertIndicator" 标签时,我该如何处理。 我尝试了所有这些组合,但 none 似乎有效:(

 <#if Response.Variables.AlertIndicator??>${Response.Variables.AlertIndicator}<#else></#if>
<#if (Response.Variables.AlertIndicator)??>${Response.Variables.AlertIndicator}<#else></#if>

${Response.Variables.AlertIndicator!""}
 ${(Response.Variables.AlertIndicator)!""}

所有这些都给了我一个例外

Expected a string or something automatically convertible to string (number, date or boolean), but this evaluated to a sequence+hash
Tip: This XML query result can't be used as string because for that it had to contain exactly 1 XML node, but it contains 0 nodes

唯一似乎是 "has_content" 但它需要两倍的时间来处理这对我的应用程序来说是一个很大的否定

您可以使用 ?size,当标签存在时它会大于 0

<#if Response.Variables.AlertIndicator?size gt 0>${Response.Variables.AlertIndicator}</#if>

但不确定它是否会比 ?has_content 快,您需要检查一下,如果不是,请以不同的方式对其进行优化。在检查之前分配给变量是一个简单的优化。

<#assign x=Response.Variables.AlertIndicator>
<#if x?size gt 0>${x}</#if>

DOM 查询的结果始终是一个节点列表,即使可能是一个 0 长度列表。结果节点列表本身总是存在的,所以 Response.Variables.AlertIndicator?? 总是 true。 (这也意味着如果没有 Variables 并且没有 AltertIndicators,该查询将工作相同,即,您可以安全地链接这些步骤。)因此您必须检查第一个节点是否在结果列表中存在:Response.Variables.AlertIndicator[0]??