IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

XML/XSL et SOAP Discussion :

Travailler sur des données qui doivent être triées


Sujet :

XML/XSL et SOAP

  1. #1
    Membre émérite

    Homme Profil pro
    Urbaniste
    Inscrit en
    Mars 2002
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Urbaniste

    Informations forums :
    Inscription : Mars 2002
    Messages : 255
    Points : 2 717
    Points
    2 717
    Par défaut Travailler sur des données qui doivent être triées
    Salut,

    Je voudrais savoir comment faire pour travailler sur des données après qu'elles soient triées par <xsl:sort>.

    En pratique, j'ai une liste de fonctions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <categorie nom="Fonctions générales" id="generale">
      <fonction page="lisp" nom="Lisp">Convertit une expression en expression
        au format LISP</fonction>
      <fonction page="sign" nom="Signe">Signe d'un élément</fonction>
      <fonction page="abs" nom="Abs">Valeur absolue</fonction>
      <fonction page="min" nom="Min">Minimum de deux expressions</fonction>
      <fonction page="max" nom="Max">Maximum de deux expressions</fonction>
      <fonction page="opposite" nom="Oppose">Opposé d'un élément</fonction>
      <fonction page="more_less" nom="PlusMoins">Plus ou moins une valeur</fonction>
    </categorie>
    On va dire qu'on y accède via "document('fct.xml')/categorie".

    Je les affiche donc par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <xsl:for-each select="document('fct.xml')/categorie/fonction">
          <xsl:sort select="@nom" />
    <li>
      <a href="{@page}.php" title="{.}"><xsl:value-of select="@nom" /></a>
    </li>
    </xsl:for-each>
    Super, c'est trié !

    Mainteant, plus dur : trouver la fonction suivante et précédente, sachant que la fonction actuelle est identifiée par sa page ($page) : "fonction[@page=$page]" ... dans la liste triée !

    Pour trouver la fonction suivante, non triée c'est un truc du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    <xsl:variable name="fct_cate" select="document('fct.xml')/categorie" />
    <xsl:value-of select="$fct_cate/fonction[@page=$page]/following-sibling::*[1]/@page" />
    Pour la précédente, on prend : on utilise "preceding-sibling::*[1]".


    @+ Haypo

  2. #2
    Membre confirmé
    Avatar de grishka
    Inscrit en
    Janvier 2003
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 285
    Points : 499
    Points
    499
    Par défaut
    si j'ai bien compris, le problème est que tu n'arrives pas à accéder au noeud précédent ou suivant lors du parcours dans l'ordre?

    En fait XPath ne calcule pas d'arbre résultat trié préalablement au parcours : il tri en même temps. Du coup il ne conserve pas l'ordre en mémoire et pour lui le noeud suivant ou précédent du noeud courant est celui dans la liste initiale.


    hop , je te donne un exemple simple pour te rendre compte du problème :



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    	<xsl:output method="html"/>
    	<xsl:template match="list">
    		<table width="70%" border="0">
    			<center>
    				<xsl:for-each select="a">
    					<xsl:sort select="date"/>
    					<tr>
    						<td>
    								actuel : <xsl:value-of select="date"/>
    						</td>
    						<td>
    								precedent : <xsl:value-of select="preceding-sibling::*/date"/>
    						</td>
    					</tr>
    				</xsl:for-each>
    			</center>
    		</table>
    		<br/>
    	</xsl:template>
    </xsl:stylesheet>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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="ISO-8859-1"?>
    <list>
    	<a>
    		<date>20030601</date> 
          </a>
    	<a>
    		<date>20030501</date> 
          </a>
    	<a>
    		<date>20030622</date> 
          </a>
    	<a>
    		<date>20030301</date> 
          </a>
    	<a>
    		<date>20030401</date> 
          </a>
    	<a>
    		<date>20020601</date> 
          </a>
    	<a>
    		<date>20020608</date> 
          </a>
    	<a>
    		<date>20020601</date> 
          </a>
    	<a>
    		<date>20050618</date> 
          </a>
    	<a>
    		<date>20050603</date> 
          </a>
    	<a>
    		<date>20050611</date> 
          </a>
    </list>
    résultat :

    actuel : 20020601 precedent : 20030401
    actuel : 20020601 precedent : 20020608
    actuel : 20020608 precedent : 20020601
    actuel : 20030301 precedent : 20030622
    actuel : 20030401 precedent : 20030301
    actuel : 20030501 precedent : 20030601
    actuel : 20030601 precedent :
    actuel : 20030622 precedent : 20030501
    actuel : 20050603 precedent : 20050618
    actuel : 20050611 precedent : 20050603
    actuel : 20050618 precedent : 20020601

    tu vois que ce n'est pas vraiment ce que je veux, et pourtant c'est logique d'obtenir ce résultat (si on considère que le tri se fait par partionnement-fusion)!! comment faire pour obtenir :

    actuel : 20020601 precedent :
    actuel : 20020601 precedent : 20020601
    actuel : 20020608 precedent : 20020601
    ...

    Solution brutale : pour chaque noeud trié, reparcourir dans l'ordre la liste jusque la position précédente ou suivante.
    Je ne vois pas d'autre solution pour l'instant
    "Les gens normaux croient que si ca marche, c'est qu'il n'y a rien à reparer. Les ingénieurs croient que si ca marche, c'est que ca ne fait pas encore assez de choses."
    --Scott Adams

  3. #3
    Membre émérite

    Homme Profil pro
    Urbaniste
    Inscrit en
    Mars 2002
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Urbaniste

    Informations forums :
    Inscription : Mars 2002
    Messages : 255
    Points : 2 717
    Points
    2 717
    Par défaut
    Donc, si j'ai bien compris, le mieux est de trier le fichier une fois pour toute :-)

    Etant donné qu'il ne change pas souvent, je pourrais écrire une fonction qui trie puis génère un fichier "liste_fct_triee.xml" ...

    Ca éviterai pas mal de bidouilles.

    @+ Haypo

Discussions similaires

  1. [Toutes versions] Comment travailler sur des données stockées en mémoire, plutôt que sur une feuille
    Par wyzer dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 19/04/2011, 13h35
  2. Réponses: 0
    Dernier message: 18/10/2010, 11h26
  3. tri basé sur des données SQL
    Par ddrmax dans le forum C++Builder
    Réponses: 2
    Dernier message: 22/09/2009, 10h03
  4. problème de Tri sur des données multicolonnes
    Par dz_robotix dans le forum C++Builder
    Réponses: 3
    Dernier message: 27/03/2009, 00h38
  5. tri sur un lien qui doit être un integer
    Par Pascale38 dans le forum Struts 1
    Réponses: 6
    Dernier message: 06/09/2006, 10h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo