如何使用 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
是一个包含单个节点的序列,因此它“有内容”。此外,任何子变量查询(.
或 [...]
)只给出一系列匹配节点,而不是节点本身。 (因此,例如,如果您只有一个 street1
,arr.street1[0]
只会返回原始序列。这可能非常令人惊讶,但这只是 XPath 的方法。)
所以,做这个检查:adr.street1?children?has_content
。因为children的个数是0。如果street1
只能包含文字,那么这样更好:adr.street1 != ''
.
您不需要像 !
或 ?exists
这样的存在检查,因为 XML 查询保证 return 一些结果。如果没有匹配,它只是一个空序列。
我找不到合适的内置函数来检查节点是否为空。
这是 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
是一个包含单个节点的序列,因此它“有内容”。此外,任何子变量查询(.
或 [...]
)只给出一系列匹配节点,而不是节点本身。 (因此,例如,如果您只有一个 street1
,arr.street1[0]
只会返回原始序列。这可能非常令人惊讶,但这只是 XPath 的方法。)
所以,做这个检查:adr.street1?children?has_content
。因为children的个数是0。如果street1
只能包含文字,那么这样更好:adr.street1 != ''
.
您不需要像 !
或 ?exists
这样的存在检查,因为 XML 查询保证 return 一些结果。如果没有匹配,它只是一个空序列。