Accueil
Club Emploi Blogs   TV   Dév. Web PHP XML Python Autres 2D-3D-Jeux Sécurité Windows Linux PC Mac
Accueil Conception Java DotNET Visual Basic  C  C++ Delphi Eclipse MS-Office SQL & SGBD Oracle  4D  Business Intelligence
logo



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


Les sources présentés sur cette page sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre cette page de présentation de ces sources constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright ©2006  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'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts. Cette page est déposée à la SACD.

Vos questions techniques : forum d'entraide Accueil - Publiez vos articles, tutoriels, cours et rejoignez-nous dans l'équipe de rédaction du club d'entraide des développeurs francophones. Nous contacter - Copyright 2000..2005 www.developpez.com