Calcul/Somme XML / XSL , comment faire ?
Hello
j'aimerai faire une somme de différence positive. Exemple XML d'une RAndo avec des étapes et des altitudes.
puis j'essaye de faire une transformation pour avoir le total ascencion positive . (c.a.d qu'on ne compte que lorsque le point est supérieur au précédent)
mais j'ai besoin de conseil car j'y arrive pas...d'un seul coup.
DE plus si qq pouvais me conseiller sur mon 1er XSL (si on peut l'optimiser) car comme je débute, il me semble qu'il est pas top.
Merci à tous.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| <?xml version="1.0" encoding="UTF-8"?>
<RANDONNEE>
<ETAPE>
<ALTITUDE>1360</ALTITUDE>
</ETAPE>
<ETAPE>
<ALTITUDE>1374</ALTITUDE>
</ETAPE>
<ETAPE>
<ALTITUDE>1401</ALTITUDE>
</ETAPE>
<ETAPE>
<ALTITUDE>1621</ALTITUDE>
</ETAPE>
<ETAPE>
<ALTITUDE>1559</ALTITUDE>
</ETAPE>
<ETAPE>
<ALTITUDE>1584</ALTITUDE>
</ETAPE>
<ETAPE>
<ALTITUDE>1493</ALTITUDE>
</ETAPE>
<ETAPE>
<ALTITUDE>1658</ALTITUDE>
</ETAPE>
<ETAPE>
<ALTITUDE>1417</ALTITUDE>
</ETAPE>
<ETAPE>
<ALTITUDE>1367</ALTITUDE>
</ETAPE>
<ETAPE>
<ALTITUDE>1358</ALTITUDE>
</ETAPE>
</RANDONNEE> |
=> le XSL suivant me permet d'avoir les DELTAs.
Il est simple d'appliquer une 2 ème transformation pour n'avoir que la SUM des Deltas positif, mais comment y arriver sans faire 2 XSL ?
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
| <?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output method="xml"/>
<xsl:template match="RANDONNEE">
<xsl:element name="CALCUL">
<xsl:for-each select="ETAPE">
<xsl:choose>
<xsl:when test="position()=1">
<xsl:text>
</xsl:text>
<xsl:element name="ALTITUDE0">
<xsl:value-of select="substring(./ALTITUDE,1,4)">
</xsl:value-of>
</xsl:element>
<xsl:text>
</xsl:text>
<xsl:element name="DELTA0">0 </xsl:element>
</xsl:when>
<xsl:otherwise>
<xsl:text>
</xsl:text>
<xsl:element name="ALTITUDE">
<xsl:value-of select="substring(./ALTITUDE,1,4)">
</xsl:value-of>
</xsl:element>
<xsl:text>
</xsl:text>
<xsl:element name="DELTA">
<xsl:variable name="POS" select="position()"/>
<xsl:element name="POS">
<xsl:value-of select="$POS">
</xsl:value-of>
</xsl:element>
<xsl:variable name="POSP" select="position()-1"/>
<xsl:element name="POSP">
<xsl:value-of select="$POSP">
</xsl:value-of>
</xsl:element>
<xsl:variable name="ALT" select="substring(./ALTITUDE, 1,4)"/>
<xsl:element name="ALT">
<xsl:value-of select="$ALT">
</xsl:value-of>
</xsl:element>
<xsl:variable name="PREC"
select="substring(../ETAPE[$POSP]/ALTITUDE, 1,4)"/> <xsl:element name="PREC">
<xsl:value-of select="$PREC">
</xsl:value-of>
</xsl:element>
<xsl:variable name="DELTA" select="number($ALT)-number($PREC)"/>
<xsl:element name="DELT">
<xsl:value-of select="$DELTA">
</xsl:value-of>
</xsl:element>
</xsl:element>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</xsl:element>
</xsl:template>
</xsl:stylesheet> |
Pb de Performances pour ce XSL
Bonjour, et merci pour votre essai. Entre temps j'avais trouvé sur unnsite comment faire une Boucle. J'ai essayé de mon coté et trouvé une solution.
Puis en testant le votre, je me suis heurté à des pb de perf.
En effet, le votre met un temp fou. (le mien un peu moins) j'ai recherché pour comprendre (car j'apprend) et je pense qu'il s'agit du fait que votre algorithme recalcul tout le cumul pour chaque elt. (for-each //etape)
Merci pour votre essai, j'ai appris un peu plus.
ma solution :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
| <?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
<xsl:output method="xml" indent='yes'/>
<xsl:template match="RANDONNEE">
<xsl:element name="RANDO">
<xsl:text>
</xsl:text>
<xsl:call-template name="boucleplus">
</xsl:call-template>
</xsl:element>
</xsl:template>
<xsl:template name="boucleplus">
<xsl:param name="debut" select="1" />
<xsl:param name="fin" select="count(//ETAPE)" />
<xsl:param name="cumul" select="0" />
<xsl:if test="$cumul >0">
<xsl:text>Nv Cumul : </xsl:text>
<xsl:value-of select="$cumul"></xsl:value-of>
</xsl:if>
<xsl:text>
i = </xsl:text>
<xsl:value-of select="$debut" /> <xsl:text> / </xsl:text> <xsl:value-of select="$fin" />
<xsl:variable name="prec" select="number($debut)-1"></xsl:variable>
<xsl:text> Prec : </xsl:text><xsl:value-of select="$prec"></xsl:value-of>
<xsl:text> Alt courant : </xsl:text>
<xsl:value-of select="substring(//ETAPE[$debut]/ALTITUDE, 1,4)"> </xsl:value-of>
<xsl:text> Alt prec : </xsl:text>
<xsl:value-of select="substring(//ETAPE[$prec]/ALTITUDE, 1,4)"> </xsl:value-of>
<xsl:text> Cumul prec : </xsl:text> <xsl:value-of select="$cumul"> </xsl:value-of>
<xsl:if test="($debut)=($fin)">
<xsl:call-template name="lastetape">
<xsl:with-param name="cumuldef" select="$cumul" /> </xsl:call-template>
</xsl:if>
<xsl:if test="$debut < $fin">
<xsl:variable name="debutprec" select="($debut) - 1"></xsl:variable>
<xsl:choose>
<xsl:when test="$debut > 1">
<xsl:if test="substring(//ETAPE[$debut]/ALTITUDE, 1,4) > substring(//ETAPE[$debutprec]/ALTITUDE, 1,4)">
<xsl:variable name="delta" select="number(substring(//ETAPE[$debut]/ALTITUDE, 1,4)) -number( substring(//ETAPE[$debutprec]/ALTITUDE, 1,4))"></xsl:variable>
<xsl:call-template name="cumuler">
<xsl:with-param name="cumul" select="($cumul) + ($delta)" />
</xsl:call-template>
<xsl:call-template name="boucleplus">
<xsl:with-param name="debut" select="($debut)+1" />
<xsl:with-param name="fin" select="$fin" />
<xsl:with-param name="cumul" select="($cumul) + ($delta)" />
</xsl:call-template>
</xsl:if>
<xsl:if test="substring(//ETAPE[$debut]/ALTITUDE, 1,4) <= substring(//ETAPE[$debutprec]/ALTITUDE, 1,4)">
<xsl:variable name="delta" select="0"></xsl:variable>
<xsl:call-template name="cumuler">
<xsl:with-param name="cumul" select="($cumul) + ($delta)" />
</xsl:call-template>
<xsl:call-template name="boucleplus">
<xsl:with-param name="debut" select="($debut)+1" />
<xsl:with-param name="fin" select="$fin" />
<xsl:with-param name="cumul" select="($cumul) + ($delta)" />
</xsl:call-template>
</xsl:if>
</xsl:when>
<xsl:otherwise>
<xsl:call-template name="boucleplus">
<xsl:with-param name="debut" select="($debut)+1" />
<xsl:with-param name="fin" select="$fin" />
<xsl:with-param name="cumul" select="($cumul)" />
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:if>
</xsl:template>
<xsl:template name="cumuler">
<xsl:param name="cumul" select="0" />
<xsl:text> Cumul inter : </xsl:text>
<xsl:value-of select="$cumul"> </xsl:value-of>
<xsl:text>
</xsl:text>
</xsl:template>
<xsl:template name="lastetape">
<xsl:param name="cumuldef" select="0" />
<xsl:text> Cumul Final : </xsl:text>
<xsl:value-of select="$cumuldef">
</xsl:value-of>
<xsl:text>
</xsl:text>
</xsl:template>
</xsl:stylesheet> |