2009-12-14 79 views
6

tengo los siguientes datos XML:XSLT 1.0 Agrupar por

<?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> 

En XSLT 1.0, quiero group by y crear una tabla para los empleados en cada tienda. entonces en los datos anteriores, se crearían 3 tablas. Una tabla con dos filas para los primeros 2 registros (tienda 180), etc.

¿Cómo puedo hacer esto en 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

[Ver similar de preguntas y respuestas] (http://stackoverflow.com/q/18311162/287948). –

Respuesta

14

Muenchian grouping es el mejor enfoque; algo así como:

<?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 es la palabra mágica :) – annakata

+0

Gracias Marc :-) – Neil

+0

Necesito agruparme en base al nodo hijo, ¿funcionará? ¿Puede proporcionar muestras según mi xml? – jvm

1

quizá más fácil de entender

<?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>