2010-02-19 10 views
0

Avec XSLT, comment puis-je modifier les éléments suivants:Sums et catégorie de regroupement avec XSLT

<root> 
    <element id="1" State="Texas" County="Dallas" Population="2412827" /> 
    <element id="2" State="Texas" County="Harris" Population="3984349" /> 
    <element id="3" state="Georgia" County="Fulton" Population="1014932" /> 
    <element id="4" state="Georgia" County="Richmond" Population="212775" /> 
</root> 

dans:

<body> 
    <h2>Texas</h2> 
    <table> 
    <tr><td>Dallas</td><td>2412827</td></tr> 
    <tr><td>Harris</td><td>3984349</td></tr> 
    <tr><td>Total</td><td>6397176</td></tr> 
    <h2>Georgia</h2> 
    <table> 
    <tr><td>Fulton</td><td>1014932</td></tr> 
    <tr><td>Richmond</td><td>212775</td></tr> 
    <tr><td>Total</td><td>1227707</td></tr> 
    </table> 
</body> 

sans coder explicitement le nom de chaque Etat, parce que je vissable si Puerto Rico est devenu un état.

Répondre

4

XSLT 1.0
Définir une clé « état », à partir de laquelle nous pouvons choisir facilement tous les états donné un nom d'état. Ensuite, appliquez le groupement Muenchian pour trouver les états uniques dans l'entrée.

Ensuite, il devient simple. Le modèle "element" sera appliqué une fois par nom d'état, et utilise la clé() pour récupérer toutes les entrées pour cet état.

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:output method="xml" indent="yes" /> 

    <xsl:key name="state" match="element" use="@State" /> 

    <xsl:template match="root"> 
     <body> 
      <xsl:apply-templates select="element[generate-id(.)=generate-id(key('state',@State)[1])]"/> 
     </body> 
    </xsl:template> 

    <xsl:template match="element"> 
     <h2><xsl:value-of select="@State" /></h2> 
     <table> 
      <xsl:for-each select="key('state',@State)"> 
       <tr> 
        <td> 
         <xsl:value-of select="@County" /> 
        </td> 
        <td> 
         <xsl:value-of select="@Population" /> 
        </td> 
       </tr> 
      </xsl:for-each> 

      <tr> 
       <td> 
        <xsl:text>Total</xsl:text> 
       </td> 
       <td> 
        <xsl:value-of select="sum(key('state',@State)/@Population)"/> 
       </td> 
      </tr> 

     </table> 
    </xsl:template> 

</xsl:stylesheet> 

XSLT 2,0

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:output method="xml" indent="yes" /> 

    <xsl:template match="root"> 
     <body> 
      <xsl:for-each-group select="element" group-by="@State"> 
       <h2><xsl:value-of select="@State" /></h2> 
       <table> 
        <xsl:for-each select="current-group()"> 
         <tr> 
          <td> 
           <xsl:value-of select="@County" /> 
          </td> 
          <td> 
           <xsl:value-of select="@Population" /> 
          </td> 
         </tr> 
        </xsl:for-each> 
        <tr> 
         <td> 
          <xsl:text>Total</xsl:text> 
         </td> 
         <td> 
          <xsl:value-of select="format-number(sum(current-group()/@Population), '#########')"/> 
         </td> 
        </tr> 
       </table> 
      </xsl:for-each-group> 
     </body> 
    </xsl:template> 

</xsl:stylesheet> 
+0

+1 me devança de quelques secondes. :) Je pense que c'est une question de devoirs, du moins c'est ce que l'on ressent. – Tomalak

+1

Pas un devoir. Je ne suis pas trop avancé avec XSLT. Aussi, quelqu'un d'autre m'a dit que ce n'était pas possible et que cela ne me semblait pas être le cas. Je savais que SO serait en mesure de m'aider. – kzh

Questions connexes