#xml #freemarker
#xml #freemarker
Вопрос:
Я не могу найти правильную встроенную функцию для проверки, пуст ли узел.
Вот xml
пример узла —
<address>
<street1/>
<street2/>
<city/>
<zip/>
<country>BD</country>
</address>
Я пытался использовать, adr.street1?has_content
но это не возвращает false
, поскольку узел присутствует.
<#list address as adr>
<#if adr.street1?exists amp;amp; adr.street1?has_content>
street1 is present //this line executes but it shouldn't be since street1 has no value.
</#if>
</#list>
Ответ №1:
adr.street1
это последовательность, которая содержит один узел, поэтому она «имеет содержимое». Кроме того, любой переменный запрос ( .
или [...]
) просто выдает последовательность совпадающих узлов, а не сам узел. (Так, например, если у вас есть только один street1
, arr.street1[0]
просто возвращает исходную последовательность. Что может быть довольно удивительно, но это всего лишь подход XPath.)
Итак, выполните эту проверку: adr.street1?children?has_content
. Потому что количество дочерних элементов равно 0. Если street1
может содержать только текст, то это лучше: adr.street1 != ''
.
Вам не нужны проверки существования, такие как !
или ?exists
, потому что XML-запросы гарантированно возвращают некоторый результат. Если совпадения нет, это просто пустая последовательность.
Ответ №2:
По какой-то причине он возвращается непустым. Вы должны быть в состоянии избежать использования размера или длины для этого.
<#list address as adr>
<#if adr.street1?exists amp;amp; (adr.street1!?size > 0 || adr.street1!?length > 0)>
street1 is present
</#if>
</#list>