Domanda

Sono nuovo di lavorare con XSLT e sto cercando di creare una tabella pivot utilizzando il metodo Muenchian (dal momento che sembra che IE ancora non supporta XSLT 2.0 Penso che mi sono bloccato con questo). Sono in grado di ottenere il raggruppamento desiderato però sto cercando di ottenere la somma di un attributo per ogni gruppo. Per fare la somma dell'attributo possibile utilizzare la funzione somma aggregata o devo scorrere le chiavi e memorizzare i valori in una variabile? Questo è quello che ho finora:

<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>
È stato utile?

Soluzione

Easy - dove già lì. Visualizza intera soluzione qui di seguito.

In una nota diversa, vi consiglio contro l'uso di <xsl:for-each> a favore di <xsl:apply-templates>. Il codice diventa un po 'più a lungo, ma la leggibilità e la struttura del codice migliora, IMHO.

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

Altri suggerimenti

Perché il nodo di contesto corrente all'interno del ciclo è un elemento di registrazione, è necessario per assicurare il vostro 'somma' include tutti i record con un corrispondente PersonID attributo. Qualcosa del genere dovrebbe fare:

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

In alternativa, perché non si sa l'elemento record corrente è il primo con un particolare attributo PersonID, si potrebbe anche fare questo in questo caso

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

Si dovrebbe essere in grado di utilizzare somma se è possibile utilizzare un XPath per selezionare l'attributo per il record desiderato (s).

Senza conoscere la struttura del XML di input non so cosa sarebbe ma credo che nel tuo caso qualcosa come <xsl:value-of select="sum(@cost)"/>

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top