Назначение пустой строки, если XML-узел не существует во Freemarker - PullRequest
0 голосов
/ 28 августа 2018

У меня есть 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 Ответ

0 голосов
/ 28 августа 2018

Короче говоря:

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...