Как проверить пустой узел с помощью FreeMarker

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