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

时间:2018-02-02 02:28:32

标签: java xml freemarker smooks

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

当" AlertIndicator"输入XML中不存在tag,我该如何处理它。 我尝试了所有这些组合,但似乎都没有用:(

 <#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

唯一似乎是&#34; has_content&#34;但它需要两倍的处理时间,这对我的应用来说是一个很大的NO

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

标签存在时,您可以使用大于 var timeScale1 = d3.scaleTime() .domain([new Date(2018, 0, 1), new Date(2018, 0, 31)]) .range(0, 700); var temp1 = timeScale1(new Date(2018, 0, 20)); console.log(temp1); // 443.3333333333333 (pixels) 的{​​{1}}:

?size

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

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