См. Мою заметку по вашему вопросу относительно "какой версии XSLT?".Если в вашей целевой версии поддерживается группировка, см. Другие ответы здесь, поскольку это легче понять и почти наверняка будет работать лучше на любом процессоре XSLT.Если вы не уверены, я рекомендую использовать решение 1.0, подобное этому.
Вы можете сделать это с «фрагментом XML» точно так же, как вы писали с большинством процессоров XSLT, но я добавил «root»элемент в ваш XML, чтобы уменьшить некоторые неизвестные при ответе на ваш вопрос.
В этом решении ниже, я попытался сохранить прямую корреляцию между формой XSLT и формой вывода, который вы хотите.По моему мнению, это облегчает поддержку / понимание, по крайней мере, для небольших таблиц стилей.
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/root">
<xsl:for-each select="t">
<div class='t'>
<xsl:for-each select="following-sibling::*[count(preceding-sibling::t)=(count(current()/preceding-sibling::t) + 1) and not(self::t)]">
<div class='{name()}' />
</xsl:for-each>
</div>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
Правая часть "follow-sibling :: * [count (previous-sibling :: t)"= (count (current () / previous-sibling :: t) + 1) и not (self :: t)] "можно упростить, я уверен, используя что-то вроде" current () :: position () "(что неверно, к вашему сведению), но я ржавый и не могу вспомнить некоторые из синтаксиса псевдонимов.
Это в основном говорит: 1) Оценивать каждый T. 2) Выберите элементы с одинаковым количествомиз T, предшествующего им, в качестве индекса T, который мы в настоящее время оцениваем.
Обратите внимание, что вы, вероятно, пытались выполнить итерацию в процедурном порядке и обнаружили, что не можете сохранить последнее значение, найденное в XSLT.Или вы обнаружили, что можете, но только с вложенными шаблонами.Этот тип поворота, который вы выполняете, заставляет многих неофитов XSLT преодолевать блокпосты, так что не расстраивайтесь.