Mangiare Senza Glutine disponibile su App Store

Per altre informazioni scrivi a fabriziocaldarelli@negusweb.it

Somma di numeri decimali con XSLT

Da Programmazione Software.

Il problema

Spesso capita di dover usare la funzione sum() di XSLT per fare la somma di nodi. Però a volte questi numeri non sono interi, ma decimali. La funzione sum() in questo caso restituisce NaN perchè non riconosce la "," per i numeri decimali, la formattazione classica con cui i numeri decimali vengono inseriti nell'xml. A questo punto bisogna prima operare una conversione della "," in "." e poi effettuare la somma. Il template che segue fa proprio questo: per ciascun nodo del nodeset passato come parametro "items", trasforma la "," in "." e poi ne effettua la somma, ricorsivamente.

<xsl:template name="sum-float">
     <xsl:param name="items" />
     <xsl:param name="currentTotal" select="0" />
     <xsl:choose>
          <xsl:when test="$items">
               <xsl:variable name="valoreItem" select="translate($items[1],',','.')"/>
               <xsl:call-template name="sum-float">
               <xsl:with-param name="items" select="$items[position() > 1]" />
               <xsl:with-param name="currentTotal" select="$valoreItem + $currentTotal" />
               </xsl:call-template>
          </xsl:when>
     <xsl:otherwise>
          <xsl:value-of select="$currentTotal" />
     </xsl:otherwise>
     </xsl:choose>
</xsl:template>


Utilizzo

Per chiamare questo template basta passare il nodeset come parametri item, ovvero:

<xsl:variable name="sommaTotale">
<xsl:call-template name="sum-float">
     <xsl:with-param name="items" select="/root/items"/>
</xsl:call-template>
</xsl:variable>