Эта таблица стилей должна помочь:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<!-- Key for Group attributes -->
<xsl:key name="nodesByGroups" match="node[@Group]" use="@Group" />
<xsl:template match="/*">
<!-- Making shallow copy of root element -->
<xsl:copy>
<!-- Making deep copy of all child elements, as well as any root element attributes -->
<xsl:copy-of select="*|@*" />
<!-- Calling the template for grouping on the root element -->
<xsl:call-template name="group" />
</xsl:copy>
</xsl:template>
<xsl:template name="group">
<!-- Apply the technique known as Muenchian grouping -->
<xsl:for-each select="//node[generate-id() = generate-id(key('nodesByGroups', @Group)[1])]/@Group">
<xsl:variable name="group" select="." />
<xsl:element name="node">
<xsl:attribute name="GroupTitle"><xsl:value-of select="$group" /></xsl:attribute>
<xsl:element name="nodes">
<xsl:copy-of select="/*//node[@Group = $group]" />
</xsl:element>
</xsl:element>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
Во втором шаблоне используется метод, известный как Muenchian grouping .Поначалу может быть немного сложно понять, если вы не знакомы с XSLT и XPath, но как только вы его получите, он станет отличным инструментом.Здесь есть подробное объяснение здесь .
РЕДАКТИРОВАТЬ: вы можете написать второй шаблон, как этот, если вы найдете его более разборчивым:
<xsl:template name="group">
<!-- Apply the technique known as Muenchian grouping -->
<xsl:for-each select="//node[generate-id() = generate-id(key('nodesByGroups', @Group)[1])]/@Group">
<xsl:variable name="group" select="." />
<node GroupTitle="{$group}">
<nodes>
<xsl:copy-of select="/*//node[@Group = $group]" />
</nodes>
</node>
</xsl:for-each>
</xsl:template>
РЕДАКТИРОВАТЬ 2 : хорошо, я надеюсь, что это будет делать то, что вам нужно:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<!-- Key for Group attributes -->
<xsl:key name="nodesByGroups" match="node[@Group]" use="@Group" />
<xsl:template match="/*">
<!-- Making shallow copy of root element -->
<xsl:copy>
<!-- Apply templates on all the child elements/attributes as appropriate -->
<xsl:apply-templates select="node()|@*" />
<!-- Calling the template for grouping on the root element -->
<xsl:call-template name="group" />
</xsl:copy>
</xsl:template>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*" />
</xsl:copy>
</xsl:template>
<xsl:template match="node">
<xsl:copy>
<xsl:apply-templates select="node()|@*" />
</xsl:copy>
</xsl:template>
<xsl:template match="node[@Group]">
<xsl:copy>
<xsl:apply-templates select="@*" />
</xsl:copy>
</xsl:template>
<xsl:template name="group">
<!-- Apply the technique known as Muenchian grouping -->
<xsl:for-each select="//node[generate-id() = generate-id(key('nodesByGroups', @Group)[1])]/@Group">
<xsl:variable name="group" select="." />
<xsl:element name="node">
<xsl:attribute name="GroupTitle"><xsl:value-of select="$group" /></xsl:attribute>
<xsl:element name="nodes">
<xsl:apply-templates select="/*//node[@Group = $group]" />
</xsl:element>
</xsl:element>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>