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
|