Questo è un lavoro per il gruppo di Muenchian. Ne troverai numerosi esempi all'interno del tag XSLT qui su StackOverflow.
In primo luogo, è necessario definire una chiave per aiutare a raggruppare i gruppi
<xsl:key name="groups" match="group" use="."/>
Questo cercherà gruppo elementi per un determinato nome del gruppo.
Successivamente, è necessario abbinare tutte le occorrenze della prima istanza di ciascun nome di gruppo distinto. Questo viene fatto con questa affermazione spaventoso guardare
<xsl:apply-templates select="element/group[generate-id() = generate-id(key('groups', .)[1])]"/>
elementi del gruppo cioè Partita che capita di essere la prima occorrenza di tale elemento nella nostra chiave.
Dopo aver abbinato i nodi gruppo distinto, è possibile scorrere tutti gli altri nodi del gruppo con lo stesso nome (dove $ currentGroup è una variabile che tiene il nome del gruppo corrente)
<xsl:for-each select="key('groups', $currentGroup)">
Mettendo questo dà tutto
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:key name="groups" match="group" use="."/>
<xsl:template match="/root">
<root>
<xsl:apply-templates select="element/group[generate-id() = generate-id(key('groups', .)[1])]"/>
</root>
</xsl:template>
<xsl:template match="group">
<xsl:variable name="currentGroup" select="."/>
<group>
<xsl:attribute name="name">
<xsl:value-of select="$currentGroup"/>
</xsl:attribute>
<xsl:for-each select="key('groups', $currentGroup)">
<element>
<id>
<xsl:value-of select="../id"/>
</id>
<name>
<xsl:value-of select="$currentGroup"/>
</name>
</element>
</xsl:for-each>
</group>
</xsl:template>
</xsl:stylesheet>
l'applicazione di questo sul tuo XML di esempio ha pronunciato la seguente risultato
<root>
<group name="first">
<element>
<id>1</id>
<name>first</name>
</element>
<element>
<id>3</id>
<name>first</name>
</element>
</group>
<group name="seccond">
<element>
<id>2</id>
<name>seccond</name>
</element>
</group>
</root>
fonte
2011-01-17 09:20:39
da parte del modo in cui il XML non è valido thanx primo –
lweller
Iweller :) –
ancora valida primo :) –