Назначение пустой строки, если 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]
), поэтому вы можете использовать все операторы отсутствующего значения как обычно.