Thymeleaf: как исключить внешний тег при использовании th:each?

Официальный документ Thymeleaf 2.1.4 демонстрирует использование for each, как показано ниже:

 <tr th:each="prod : ${prods}" th:class="${prodStat.odd}? 'odd'">
    <td th:text="${prod.name}">Onions</td>
    <td th:text="${prod.price}">2.41</td>
    ...
 </tr>

Он генерирует один <tr> на каждой итерации, что идеально подходит для этой ситуации. Однако в моем случае мне не нужен внешний тег (здесь <tr>).


Мой вариант использования заключается в создании тега <bookmark> рекурсивным способом, никакие другие теги не включаются, а тег <bookmark> должен содержать имя и атрибут href.

<!DOCTYPE html SYSTEM "http://www.thymeleaf.org/dtd/xhtml1-strict-thymeleaf-4.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org">
<body>

<div th:fragment="locationBookmark(location)">
    <bookmark th:each="map : ${location.subMaps}">
        <bookmark th:name="${map.name}"
                  th:href="'#'+${map.id}" th:include=":: locationBookmark(${map})">
        </bookmark>
    </bookmark>
</div>
</body>
</html>

включающая сторона:

<bookmark th:include="bookmark : locationBookmark(${rootLocation})"/>

Большое спасибо.


person July    schedule 18.06.2015    source источник
comment
Можете ли вы предоставить образец тега, который вы хотите не закрывать внешним тегом?   -  person Pavel Uvarov    schedule 18.06.2015
comment
@PavelUvarov Мой вариант использования добавлен, см. мой вопрос.   -  person July    schedule 18.06.2015
comment
Дайте угадаю: вы хотите сделать n-уровневые дочерние теги? Я так думаю, потому что: закладка не является html-тегом и потому, что не рекомендуется закрывать теги контентом. Если я прав - вы должны создать и использовать какой-то подшаблон рекурсивным образом. Я не очень хорошо разбираюсь в ThymeLeaf, чтобы сказать, как вы должны это сделать, но я точно знаю, что это возможно - пожалуйста, внимательно изучите их документы.   -  person Pavel Uvarov    schedule 18.06.2015


Ответы (4)


Даже если это можно сделать с помощью th:remove="tag", я бы посоветовал вам использовать th: заблокировать

<th:block th:each="map : ${location.subMaps}">
   <bookmark th:name="${map.name}"
        th:href="'#'+${map.id}" th:include=":: locationBookmark(${map})">
    </bookmark>
</th:block>
person Xipo    schedule 19.06.2015
comment
@ Xipo Я исправил ‹th:block› на ‹/th:block› .. надеюсь, что это правильно для всех версий Thymeleaf, но поскольку в основе лежит XML ... - person Willi Mentzel; 16.12.2016

Я придумал, как решить проблему, это несложно, достаточно добавить th:remove="tag" к внешнему тегу.

person July    schedule 19.06.2015

Вы можете использовать тег DIV или любой другой тег HTML для цикла. Это не приведет к созданию тега TR. Но чтобы таблица отображалась правильно, вам нужно иметь теги TD внутри тегов TR.

<div th:each="prod : ${prods}" th:class="${prodStat.odd}? 'odd'">
    <td th:text="${prod.name}">Onions</td>
    <td th:text="${prod.price}">2.41</td>
</div>
person shazin    schedule 18.06.2015
comment
Я хочу полностью удалить тег, а не изменить его имя. - person July; 18.06.2015

Это не совсем то, о чем просил ОП, но для некоторых это может быть полезно:

Тег также можно удалить условно:

<div class="myConditionalOuterDiv" th:remove="${condition}? tag"}> 
    <span> I'm always there </span>
</div>

Это удаляет родительский элемент, но оставляет дочерние элементы на месте.

Источник здесь

person Sofia    schedule 14.09.2020