Developpez.com

XML

Choisissez la catégorie, puis la rubrique :

logo
Sommaire > Le 'XML Stylesheet Language : Transformations' (XSLT) > Feuilles XSLT > Calcul, opération sur les nombres
        Calcul du total d'une commande
        Somme de noeuds valides
        Le minimum et le maximum d'un ensemble de noeud



Auteur : Grégory Picavet
Auteur : Erwan Amoureux
Version : 06/02/2007
Calcul du total d'une commande
De base, XSLT n'est pas fait pour faire des calculs, mais il est parfois utile de pouvoir faire une synthèse des éléments existants.
Le XML

<commande>
<produit><nb>1</nb><prix>10</prix></produit>
<produit><nb>2</nb><prix>50</prix></produit>
<produit><nb>1</nb><prix>80</prix></produit>
<produit><nb>3</nb><prix>20</prix></produit>
</commande>
Le XSLT

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
	<xsl:output method = "text"/>
	
	<xsl:template match="/">	
			<xsl:call-template name = "total" >
				<xsl:with-param name="noeuds" select="//produit"></xsl:with-param>
				<xsl:with-param name="s_total" select="0"></xsl:with-param>
			</xsl:call-template>
	</xsl:template>
	
	<xsl:template name="total">
	<xsl:param name="noeuds" />
	<xsl:param name="s_total" />
		
		
	<xsl:choose>
		<xsl:when test="$noeuds[position()>1]">
		<xsl:call-template name = "total" >
				<xsl:with-param name="noeuds" select="$noeuds[position()>1]"></xsl:with-param>
				<xsl:with-param name="s_total" select="$s_total+(number($noeuds[1]/nb)*number($noeuds[1]/prix))"></xsl:with-param>
			</xsl:call-template>
		</xsl:when>
	  
		<xsl:otherwise>
		 total : <xsl:value-of select="$s_total+(number($noeuds[1]/nb)*number($noeuds[1]/prix))" />
		</xsl:otherwise>
	</xsl:choose>
	
	</xsl:template>

</xsl:stylesheet>
Le Résultat
total : 250

Auteur : Grégory Picavet
Version : 06/02/2007
Somme de noeuds valides
Voilà comment faire la somme de certains noeuds uniquement. Ici, le critère de sélection est : le noeud est une feuille (il ne contient pas d'autres balises) ou son attribut valeur est supérieur à la sommes des attributs valeur des ses descendants valides.
Le XSLT

<?xml version="1.0"?>
	<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
	
	   <xsl:output method="text"/>
	
	   <xsl:template match="racine">
	      somme : <xsl:call-template name="sommeniveau">
	         <xsl:with-param name="resultat" select="0"/>
	         <xsl:with-param name="noeud" select="n[position()=1]"/>
	      </xsl:call-template>
	   </xsl:template>
	   
	   <xsl:template name="sommeniveau">
	      <xsl:param name="resultat"/>
	      <xsl:param name="noeud"/>
	
	     <xsl:choose>
	        <xsl:when test="$noeud">
	         <xsl:variable name="ssres">
	            <xsl:if test="$noeud/n">
	               <xsl:call-template name="sommeniveau">
	                  <xsl:with-param name="resultat" select="0"/>
	                  <xsl:with-param name="noeud" select="$noeud/n[position()=1]"/>
	               </xsl:call-template>
	            </xsl:if>
	            <xsl:if test="not($noeud/n)">0</xsl:if>
	         </xsl:variable>
	         <xsl:variable name="somme">
	           <xsl:choose>
	            <xsl:when test="$noeud/@valeur > number($ssres)">
	              <xsl:value-of select="$resultat+number($ssres)+$noeud/@valeur"/>
	            </xsl:when>
	            <xsl:otherwise>
	              <xsl:value-of select="$resultat+number($ssres)"/>
	            </xsl:otherwise>
	           </xsl:choose>
	         </xsl:variable>
	         <xsl:call-template name="sommeniveau">
	           <xsl:with-param name="resultat" select="number($somme)"/>
	           <xsl:with-param name="noeud" select="$noeud/following-sibling::*"/>
	         </xsl:call-template>
	        </xsl:when>
	        <xsl:otherwise><xsl:value-of select="$resultat"/></xsl:otherwise>
	     </xsl:choose>
	      
	   </xsl:template>
	
	</xsl:stylesheet>
Le XML (1)

<racine>
	<n valeur="112">
		<n valeur="28">
			<n valeur="3"/>
			<n valeur="8">
				<n valeur="4"/>
				<n valeur="5"/>
			</n>
			<n valeur="9">
				<n valeur="6"/>
			</n>
		</n>
		<n valeur="18">
			<n valeur="6">
				<n valeur="7"/>
			</n>
			<n valeur="8"/>
		</n>
	</n>
</racine>
Résultat : somme : 200
Le XML (2)

<racine>
	<n valeur="1">
		<n valeur="2">
			<n valeur="1"/>
			<n valeur="2"/>
		</n>
		<n valeur="4"/>
	</n>
</racine>
Résultat : somme : 7


Auteur : Erwan Amoureux
Version : 06/02/2007
Le minimum et le maximum d'un ensemble de noeud
Permet de récolter les bornes d'un ensemble de noeuds.
Le XML

<?xml version="1.0" encoding="UTF-8"?>
<r>
	<a>1</a>
	<a>5</a>
	<a>0</a>
	<a>3</a>
	<a>1</a>
</r>
Le XSLT

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:template match="/">
	maximum : <xsl:call-template name="Max">
	<xsl:with-param name="liste_de_nombre" select="//a"></xsl:with-param>
	</xsl:call-template>

	minimum : <xsl:call-template name="Min">
	<xsl:with-param name="liste_de_nombre" select="//a"></xsl:with-param>
	</xsl:call-template>
</xsl:template>



<xsl:template name="Max">
		<xsl:param name="liste_de_nombre"/>
		<xsl:for-each select="$liste_de_nombre">
		<xsl:sort order="descending" select="."></xsl:sort>
		<xsl:if test="position()=1">
		<xsl:value-of select="."></xsl:value-of>
		</xsl:if>
		</xsl:for-each>
		</xsl:template>
		
	<xsl:template name="Min">
		<xsl:param name="liste_de_nombre"/>
		<xsl:for-each select="$liste_de_nombre">
		<xsl:sort order="ascending" select="."></xsl:sort>
		<xsl:if test="position()=1">
		<xsl:value-of select="."></xsl:value-of>
		</xsl:if>
		</xsl:for-each>
		</xsl:template>
</xsl:stylesheet>
Le Résultat

maximum : 5
minimum : 0


Consultez les autres pages sources


Valid XHTML 1.0 TransitionalValid CSS!

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2006 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Contacter le responsable de la rubrique XML