如何使用 FreeMarker 检查空节点

How to check empty node using FreeMarker

我找不到合适的内置函数来检查节点是否为空。
这是 xml 示例节点 -

<address>
    <street1/>
    <street2/>
    <city/>
    <zip/>
    <country>BD</country>
</address>

我已经尝试使用 adr.street1?has_content,但这不会 returns false 因为节点存在。

<#list address as adr>
    <#if adr.street1?exists && adr.street1?has_content>
        street1 is present //this line executes but it shouldn't be since street1 has no value.
    </#if>
</#list>

它由于某种原因返回 non-empty。您应该能够为此使用大小或长度。

<#list address as adr>
    <#if adr.street1?exists && (adr.street1!?size > 0 || adr.street1!?length > 0)>
        street1 is present
    </#if>
</#list>

adr.street1 是一个包含单个节点的序列,因此它“有内容”。此外,任何子变量查询(.[...])只给出一系列匹配节点,而不是节点本身。 (因此,例如,如果您只有一个 street1arr.street1[0] 只会返回原始序列。这可能非常令人惊讶,但这只是 XPath 的方法。)

所以,做这个检查:adr.street1?children?has_content。因为children的个数是0。如果street1只能包含文字,那么这样更好:adr.street1 != ''.

您不需要像 !?exists 这样的存在检查,因为 XML 查询保证 return 一些结果。如果没有匹配,它只是一个空序列。