2009-12-14 14 views
6

ho i seguenti dati XML:XSLT 1.0 Raggruppa per

<?xml version="1.0" encoding="iso-8859-1"?> 
<results> 
    <result> 
     <MemberFirstName>JOHN</MemberFirstName> 
     <MemberLastName>DOE</MemberLastName> 
     <MemberLogin>1</MemberLogin> 
     <Store>0180</Store> 
    </result> 
    <result> 
     <MemberFirstName>JANE</MemberFirstName> 
     <MemberLastName>DOE</MemberLastName> 
     <MemberLogin>2</MemberLogin> 
     <Store>0180</Store> 
    </result> 
    <result> 
     <MemberFirstName>ALAN</MemberFirstName> 
     <MemberLastName>SMITH</MemberLastName> 
     <MemberLogin>3</MemberLogin> 
     <Store>0181</Store> 
    </result> 
    <result> 
     <MemberFirstName>DAVID</MemberFirstName> 
     <MemberLastName>GREEN</MemberLastName> 
     <MemberLogin>4</MemberLogin> 
     <Store>0183</Store> 
    </result> 
</results> 

In XSLT 1.0, voglio GROUP BY e creare una tabella per i dipendenti in ogni negozio. quindi nei dati di cui sopra, verrebbero create 3 tabelle. Una tabella con due righe per i primi 2 record (negozio 180), ecc.

Come posso farlo in XSLT 1.0?

<table id="table"> 
    <tr class="heading"> 
    <th scope="col">Member Id</th> 
    <th scope="col">First Name</th> 
    <th scope="col">Last Name</th> 
    </tr> 
    <xsl:for-each select="results/result"> 
    <tr> 
     <td><xsl:value-of select="MemberLogin"/></td> 
     <td><xsl:value-of select="MemberFirstName"/></td> 
     <td><xsl:value-of select="MemberLastName"/></td> 
    </tr> 
    </xsl:for-each> 
</table> 
+0

[Vedi simile di domande e risposte] (http://stackoverflow.com/q/18311162/287948). –

risposta

14

Muenchian grouping è l'approccio migliore; qualcosa di simile:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"> 

    <xsl:output method="xml" indent="yes"/>  
    <xsl:key name="groups" match="/results/result" use="Store" /> 

    <xsl:template match="/results"> 
    <xsl:apply-templates select="result[generate-id() = generate-id(key('groups', Store)[1])]"/> 
    </xsl:template> 
    <xsl:template match="result"> 
    <h1><xsl:value-of select="Store"/></h1> 
    <table id="{Store}"> 
     <tr class="heading"> 
     <th scope="col">Member Id</th> 
     <th scope="col">First Name</th> 
     <th scope="col">Last Name</th> 
     </tr> 
     <xsl:for-each select="key('groups', Store)"> 
     <tr> 
      <td><xsl:value-of select="MemberLogin"/></td> 
      <td><xsl:value-of select="MemberFirstName"/></td> 
      <td><xsl:value-of select="MemberLastName"/></td> 
     </tr> 
     </xsl:for-each> 
    </table> 
    </xsl:template> 
</xsl:stylesheet> 
+1

muench è la parola magica :) – annakata

+0

Grazie Marc :-) – Neil

+0

Ho bisogno di raggruppare in base al nodo figlio, quindi funzionerà? Potete fornire un campione come per il mio xml? – jvm

1

forse più facile da capire

<?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" indent="yes"/>  

    <xsl:template match="/results"> 
     <xsl:apply-templates select="result[not(preceding-sibling::result/Store = Store)]/Store" /> 
    </xsl:template> 

    <xsl:template match="result" > 
     <tr> 
     <td> 
      <xsl:value-of select="MemberLogin"/> 
     </td> 
     <td> 
      <xsl:value-of select="MemberFirstName"/> 
     </td> 
     <td> 
      <xsl:value-of select="MemberLastName"/> 
     </td> 
     </tr> 
    </xsl:template> 

    <xsl:template match="Store" > 
     <table id="{.}"> 
     <tr class="heading"> 
      <th scope="col">Member Id</th> 
      <th scope="col">First Name</th> 
      <th scope="col">Last Name</th> 
     </tr> 
     <xsl:variable name="temp" select="." /> 
     <xsl:apply-templates select="//result[Store = current()]" /> 
     </table> 
    </xsl:template> 

    </xsl:stylesheet>