Назначение пустой строки, если XML-узел не существует во Freemarker

У меня есть документ XML, переданный от имени root шаблону Freemarker. Я хочу, чтобы некоторые значения из этого XML были присвоены переменным в виде строки, а затем объединены / распечатаны.

<#assign MyVar = root.child1.child2.child3.mynode>

Проблема здесь в том, что даже когда путь не существует MyVar присваивается с последовательностью + хеш, который не может быть распечатан или преобразован в строку. Эта переменная хотя и возвращает false для ?has_contentМне нужен дополнительный шаг для этих проверок, и у меня та же проблема со многими переменными в файлах и модулях шаблона.

Единственное решение, которое мне удалось найти, было

<#assign MyVar = root.child1.child2.child3.mynode>
<#assign MyVar = MyVar ?has_content?then(MyVar , "")>

Я ищу что-то вроде оператора значения по умолчанию, который также проверяет наличие нулей, таких как ?has_content,

Предоставляет ли Freemarker более простую однострочную функцию для проверки отсутствия содержимого в переменной и присвоения ей значения по умолчанию?

1 ответ

Решение

Короче:

<#assign myVar = root.child1.child2.child3.mynode[0]!''>

Или просто <#assign myVar = root.child1.child2.child3.mynode[0]!> если неявное многопечатное значение по умолчанию не вызывает проблем (например, когда вы просто печатаете его с ${}).

Почему: XML-запросы (как и запросы XPath) всегда возвращают последовательность совпадающих узлов. Таких узлов может быть 0 (или 1, или несколько). Пустая последовательность не является "пропущенным значением" в соответствии с языком шаблона. Это неудобное несоответствие модели данных XML. Но хотя последовательность всегда существует, ее 1-й элемент ([0]), поэтому вы можете использовать все операторы отсутствующего значения как обычно.

Другие вопросы по тегам