2009-10-05 7 views
1

Je suis nouveau à travailler avec XSLT et j'essaie de créer un tableau croisé dynamique en utilisant la méthode Muenchian (car il semble que IE ne supporte toujours pas XSLT 2.0, je pense que je suis coincé avec cela). Je suis capable d'obtenir le groupement désiré mais j'essaye d'obtenir la somme d'un attribut pour chaque groupe. Pour faire la somme de l'attribut, puis-je utiliser la fonction de somme agrégée ou dois-je faire une boucle dans les clés et stocker les valeurs dans une variable? Voilà ce que j'ai jusqu'à présent:XSLT Tableau croisé dynamique

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="html" indent="yes" encoding="UTF-8"/> 

<xsl:key name="Person" match="Record" use="@PersonID" /> 
<xsl:template match="/"> 
    <html> 
    <body> 
    <h2>Costs Per Person</h2> 
    <table border = "1"> 
     <thead> 
     <tr> 
      <th>ID</th> 
      <th>Cost</th> 
     </tr> 
     </thead> 
     <tbody> 
     <xsl:for-each select="Records/Record[generate-id() = 
     generate-id(key('Person', @PersonID)[1])]"> 
     <tr> 
      <td> 
       <xsl:value-of select="@PersonID" /> 
      </td> 

      <td> 
       <!-- Sum Of Cost --> 
      </td> 
     </tr> 
     </xsl:for-each> 
     </tbody> 
    </table> 
    </body> 
    </html> 
</xsl:template> 

Répondre

1

facile - vous où déjà là. Voir la solution complète ci-dessous. Sur une note différente, je déconseille l'utilisation de <xsl:for-each> en faveur de <xsl:apply-templates>. Le code devient un peu plus long, mais la lisibilité et la structure du code s'améliore, à mon humble avis.

<xsl:stylesheet 
    version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
> 
    <xsl:output method="html" indent="yes" encoding="UTF-8"/> 

    <xsl:key name="Person" match="Record" use="@PersonID" /> 

    <xsl:template match="/"> 
    <html> 
     <body> 
     <h2>Costs Per Person</h2> 
     <table border = "1"> 
      <thead> 
      <tr> 
       <th>ID</th> 
       <th>Cost</th> 
      </tr> 
      </thead> 
      <tbody> 
      <xsl:apply-templates select="Records/Record" /> 
      </tbody> 
     </table> 
     </body> 
    </html> 
    </xsl:template> 

    <xsl:template match="Records/Record"> 
    <xsl:variable name="thisGroup" select"key('Person', @PersonID)" /> 

    <xsl:if test="generate-id() = generate-id($thisGroup[1])"> 
     <tr> 
     <td> 
      <xsl:value-of select="@PersonID" /> 
     </td> 
     <td> 
      <!-- Sum Of Cost --> 
      <xsl:value-of select="sum($thisGroup/@Cost)" /> 
     </td> 
     </tr> 
    </xsl:if> 
    </xsl:template> 
</xsl:stylesheet> 
+0

Cela fonctionne, merci pour votre aide! – jwarzech

0

Vous devriez être en mesure d'utiliser la somme si vous pouvez utiliser un XPath pour sélectionner l'attribut pour l'enregistrement souhaité (s).

Sans connaître la structure de votre xml d'entrée, je ne sais pas ce que ce serait, mais je suppose que dans votre cas quelque chose comme <xsl:value-of select="sum(@cost)"/>

1

Parce que votre noeud contexte actuel dans la boucle est un élément d'enregistrement, vous aurez besoin pour vous assurer que votre 'somme' inclut tous les enregistrements avec un attribut PersonID correspondant. Quelque chose comme cela devrait faire:

<xsl:value-of select="sum(../Record[@PersonID=current()/@PersonID]/@Cost)" /> 

Ou, parce que vous savez l'élément d'enregistrement en cours est le premier avec un attribut PersonID particulier, vous pouvez aussi le faire dans ce cas

<xsl:value-of select="number(@Cost) + sum(following-sibling::Record[@PersonID=current()/@PersonID]/@Cost)" /> 
+0

Merci d'avoir signalé une syntaxe que je ne connaissais pas. N'ont passé que quelques jours avec XSLT jusqu'à maintenant et tous les exemples aident! – jwarzech

Questions connexes