From: CHEKROUN Jerome (Jerome.CHEKROUN@gefco.fr)
Date: 26/09/2003 - 09:55
Ce probleme a deja etait poser Cf :
NEAGOE Florin wrote:
>
> Bonjour,
>
> J'utilise une séquence que je trie. Je voudrais pouvoir récupérer
l'élément
> précédent dans ce tri.
> La fonction position() renvoie bien la position dans la liste triée, mais
si
> j'utilise cette valeur pour récupérer l'élément position()-1, l'élément
> retourné et celui qui précède dans le fichier XML et non dans la liste
> triée.
Vous pouvez le faire en deux tris : pour chaque tri trier à nouveau een
cherchant celui qui correspond au suivant du premier tri. Je ne sais pas
si c'est gourmand en ressource (ca eleve quand meme au carré le nombre
de traitements) car je ne l'ai jamais testé sur de gros fichier.
A titre d'exemple vous pouvez faire, a partir d'un fichier suivant :
<?xml version="1.0" encoding="UTF-8"?>
<exemple topic="methode de regroupement">
<noeud class="petit">A
</noeud>
<noeud class="moyen">B
</noeud>
<noeud class="gros">C
</noeud>
<noeud class="petit">D
</noeud>
<noeud class="moyen">E
</noeud>
<noeud class="gros">F
</noeud>
<noeud class="moyen">G
</noeud>
<noeud class="gros">H
</noeud>
<noeud class="petit">I
</noeud>
<noeud class="gros">J
</noeud>
<noeud class="petit">K
</noeud>
<noeud class="moyen">L
</noeud>
</exemple>
trier et afficher les noeuds par @class en indiquant pour chaque noeud :
la classe, la position dans le tri, le texte et le texte du noeud
suivant avec la feuille xsl suivante :
<?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="/">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="exemple">
<xsl:apply-templates select="noeud">
<xsl:sort select="@class" order="ascending"/>
</xsl:apply-templates>
</xsl:template>
<xsl:template match="noeud">
<xsl:call-template name="sortieNoeuds"/>
</xsl:template>
<xsl:template name="sortieNoeuds">
<xsl:variable name="indiceNoeud" select="position()"/>
<xsl:value-of select="@class"/>
<xsl:text> : </xsl:text>
<xsl:value-of select="text()"/>
<xsl:text> position : </xsl:text>
<xsl:value-of select="position()"/>
<xsl:text>|
</xsl:text>
<xsl:if test="not(position()=last())">
<xsl:text>Noeud suivant dans le tri :</xsl:text>
<xsl:call-template name="noeudSuivant">
<xsl:with-param name="indiceNoeudSuivant" select="$indiceNoeud+1"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
<xsl:template name="noeudSuivant">
<xsl:param name="indiceNoeudSuivant" select="0"/>
<xsl:for-each select="/exemple/noeud">
<xsl:sort select="@class" order="ascending"/>
<xsl:if test="position()=$indiceNoeudSuivant">
<xsl:value-of select="text()"/>
</xsl:if>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
Donne ce réultat :
gros : C
position : 1|
Noeud suivant dans le tri :F
gros : F
position : 2|
Noeud suivant dans le tri :H
gros : H
position : 3|
Noeud suivant dans le tri :J
gros : J
position : 4|
Noeud suivant dans le tri :B
moyen : B
position : 5|
Noeud suivant dans le tri :E
moyen : E
position : 6|
Noeud suivant dans le tri :G
moyen : G
position : 7|
Noeud suivant dans le tri :L
moyen : L
position : 8|
Noeud suivant dans le tri :A
petit : A
position : 9|
Noeud suivant dans le tri :D
petit : D
position : 10|
Noeud suivant dans le tri :I
petit : I
position : 11|
Noeud suivant dans le tri :K
petit : K
position : 12|
Dans l'exemple j'indique le noeud suivant, mais ce ne sera pas le plus
dure à adapter. En terme de performance, je ne sais pas ce que ce type
d'xsl donne sur des fichiers lourds. Si vous utiliser ce genre de xsl
j'aimerais bien savoir ce que ça donne.
AleX
--
Devenez redacteur <XML>fr et contribuez au developpement du
xml francophone (http://xmlfr.org/infos/redacteurs/) !
Liste de diffusion "xml-tech@xmlfr.org" (http://xmlfr.org).
Cette liste est a votre disposition pour discuter en francais de
tout sujet technique lie a XML.
Pour resilier votre abonnement, envoyez un message contenant
la commande "unsubscribe" a xml-tech-request@xmlfr.org
(mailto:xml-tech-request@xmlfr.org?Subject=unsubscribe)
-----Message d'origine-----
De : Franck RICHARD [mailto:franck.richard@lw.mth.net]
Envoyé : vendredi 26 septembre 2003 11:50
À : xml-tech@xmlfr.org
Objet : [xml-tech] test sur valeur précédente
Bonjour à tous,
J'ai un petit soucis de test sur une valeur précédente...
je m'explique, voici ma source XML:
<CAST>
<CAST_FORM CREDIT="comedien" LEVEL="1" >Bernard Blier</CAST_FORM>
<CAST_FORM CREDIT="comedien" LEVEL="2" >Francis Blanche</CAST_FORM>
<CAST_FORM CREDIT="comedien" LEVEL="3" >Danihle Delorme</CAST_FORM>
<CAST_FORM CREDIT="realisateur" LEVEL="4" >Georges Lautner</CAST_FORM>
</CAST>
Pour l'instant j'arrive à ça :
comedien :Bernard Blier,
comedien :Francis Blanche,
comedien :Danihle Delorme,
realisateur :Georges Lautner.
C'est à dire récupérer le crédit, citez la personne, le tout trié par
numéro de level ...
En fait j'aimerais ne pas répéter le crédit quand il ne change pas,
voici le résultat souhaité :
comedien: Bernard Blier, Francis Blanche, Danihle Delorme ; realisateur:
Georges Lautner.
Je ne sais pas comment tester le credit précédent, pour ne pas le
mentionné si il est identique.
J'ai pensé à faire une boucle indépendante pour chaque crédit, mais le
problème est que les personnes doivent être triées par LEVEL, et qu'une
fois le réal peut être en LEVEL 1 une fois en 4 etc ...
Merci pour votre aide.
A bientot.
--
Devenez redacteur <XML>fr et contribuez au developpement du
xml francophone (http://xmlfr.org/infos/redacteurs/) !
Liste de diffusion "xml-tech@xmlfr.org" (http://xmlfr.org).
Cette liste est a votre disposition pour discuter en francais de
tout sujet technique lie a XML.
Pour resilier votre abonnement, envoyez un message contenant
la commande "unsubscribe" a xml-tech-request@xmlfr.org
(mailto:xml-tech-request@xmlfr.org?Subject=unsubscribe)
--
Devenez redacteur <XML>fr et contribuez au developpement du
xml francophone (http://xmlfr.org/infos/redacteurs/) !
Liste de diffusion "xml-tech@xmlfr.org" (http://xmlfr.org).
Cette liste est a votre disposition pour discuter en francais de
tout sujet technique lie a XML.
Pour resilier votre abonnement, envoyez un message contenant
la commande "unsubscribe" a xml-tech-request@xmlfr.org
(mailto:xml-tech-request@xmlfr.org?Subject=unsubscribe)
Archive générée par hypermail 2.1.3 le 28/06/2004 - 11:06 UTC
webmaster@xmlfr.org
|