Mangiare Senza Glutine disponibile su App Store

Per altre informazioni scrivi a fabriziocaldarelli@negusweb.it

Somma di numeri decimali con XSLT: differenze tra le versioni

Da Programmazione Software.
(Creata pagina con '==Introduzione== 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...')
 
 
(Una versione intermedia di uno stesso utente non è mostrata)
Riga 1: Riga 1:
==Introduzione==
+
==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.
 
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.
Riga 33: Riga 33:
 
</xsl:variable>
 
</xsl:variable>
 
</source>
 
</source>
 +
 +
[[Category:Xml]]

Versione attuale delle 11:17, 13 giu 2009

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>