IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
logo
Sommaire > Le 'XML Stylesheet Language : Transformations' (XSLT) > Feuilles XSLT > Calcul, opération sur les nombres
        Calcul du total d'une commande
        Somme de noeud valides
        Le minimum et le maximm d'un ensemble de noeud

rechercher
precedent    sommaire    suivant


Auteur : Grégory Picavet
Auteur : Erwan Amoureux
Version : 08/05/2006
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 : 08/05/2006
Somme de noeud 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 : 09/05/2006
Le minimum et le maximm 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

rechercher
precedent    sommaire    suivant

Consultez les autres pages sources


Valid XHTML 1.1!Valid 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 ni 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.