
| |
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> |
|
| |
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
|
| |
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é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.