2013-10-01 18 views
11

sto ancora imparando for-each-group qual è il modo migliore di raggruppare qualcosa di simile usando XSL? (Per nazione) sto cercando di usare XSL per convertire questo XML in un altro XML.Come utilizzare per ogni gruppo in XSL

<?xml version="1.0" encoding="UTF-8"?> 
<Person> 
    <Student> 
     <Info Country="England" Name="Dan" Age="20" Class="C" /> 
    </Student> 
    <Student> 
     <Info Country="England" Name="Dan" Age="20" Class="B" /> 

    </Student> 
    <Student> 
     <Info Country="England" Name="Sam" Age="20" Class="A" /> 
    </Student> 

    <Student> 
     <Info Country="Australia" Name="David" Age="22" Class="D" /> 
    </Student> 
    <Student> 
     <Info Country="Australia" Name="David" Age="22" Class="A" /> 
    </Student> 

</Person> 
+0

dipende da dove si desidera raggruppare su. Come vuoi che il tuo risultato sia simile? Raggruppato su "Paese" o raggruppato su "Nome" o "Classe" o una combinazione? –

risposta

27

Se si raggruppa per paese, si inizia con, ad es.

<xsl:template match="Person"> 
    <xsl:for-each-group select="Student/Info" group-by="@Country"> 
    <country name="{current-grouping-key()}"> 

    </country> 
    </xsl:for-each-group> 
</xsl:template> 

Poi si deve decidere se si desidera altro gruppo gli Info elementi in ogni gruppo di paesi, per esempio in base al nome:

<xsl:template match="Person"> 
    <xsl:for-each-group select="Student/Info" group-by="@Country"> 
    <country name="{current-grouping-key()}"> 
     <xsl:for-each-group select="current-group()" group-by="@Name"> 
     <student name="{current-grouping-key()}"> 
      <classes> 
      <xsl:for-each select="current-group()"> 
       <class><xsl:value-of select="@Class"/></class> 
      </xsl:for-each> 
      </classes> 
     </student> 
     </xsl:for-each-group> 
    </country> 
    </xsl:for-each-group> 
</xsl:template>