Группировать довольно легко, если вы можете использовать XSLT 2.0 .
Предположим, что ваш ввод выглядит примерно так:
<Games>
<Game id="g1">
<Event event_id="34" xx="1">Abcd 1</Event>
<Event event_id="33" xx="1">Abcd 2</Event>
<Event event_id="32" xx="2">Abcd 3</Event>
<Event event_id="31" xx="2">Abcd 4</Event>
</Game>
<Game id="g2">
<Event event_id="24" xx="1">Efgh 1</Event>
<Event event_id="23" xx="1">Efgh 2</Event>
<Event event_id="22" xx="2">Efgh 3</Event>
<Event event_id="21" xx="2">Efgh 4</Event>
</Game>
<Game id="g3">
<Event event_id="14" xx="1">Ijkl 1</Event>
<Event event_id="13" xx="1">Ijkl 2</Event>
<Event event_id="12" xx="2">Ijkl 3</Event>
<Event event_id="11" xx="2">Ijkl 4</Event>
</Game>
</Games>
Предположим, что вы хотите, например:для группировки событий по атрибуту xx
.
Тогда вы можете использовать xsl:for-each-group
.Атрибут select
указывает исходные объекты для группы (Game/Event
).Атрибут group-by
указывает метод группировки, на этот раз by @xx
(есть еще 3 метода).
Пример сценария может быть таким, как показано ниже:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
<xsl:strip-space elements="*" />
<xsl:template match="Games">
<xsl:copy>
<xsl:for-each-group select="Game/Event" group-by="@xx">
<Group><xsl:value-of select="current-grouping-key()"/></Group>
<xsl:apply-templates select="current-group()">
<xsl:sort select="@event_id" order="ascending" data-type="number" />
</xsl:apply-templates>
</xsl:for-each-group>
</xsl:copy>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy><xsl:apply-templates select="@*|node()"/></xsl:copy>
</xsl:template>
</xsl:stylesheet>
Чтобы упростить задачуЯ удалил предикат относительно type_id и team_id
.Для демонстрации я добавил дополнительный выходной элемент в качестве заголовка каждой группы.
Рабочий пример см. http://xsltransform.net/gVAjbSW
Если вам нужно использовать XSLT 1.0 поищите в Интернете мюнхенская группировка .Это в некоторой степени более сложная задача, но все же возможно.Есть множество примеров, даже на StackOverflow .