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

XSL/XSLT/XPATH XML Discussion :

Suivant & Précédant en XML / XSL


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre expérimenté

    Profil pro
    Inscrit en
    Mai 2003
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2003
    Messages : 412
    Points : 1 326
    Points
    1 326
    Par défaut Suivant & Précédant en XML / XSL
    Bonjour alors je vous explique mon pb. J'ai besoin d'afficher les entités suivantes et les entités précedent du noeud sur lequel je me trouve. Voici un cas pratique

    Voici mon fichier fxml.xml
    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
     
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <?xml-stylesheet href="fxsl.xsl" type="text/xsl"?> 
    <article>
    <chapitre>
    <id>1</id>
    <titre>chap 1</titre>
    <texte>texte 1</texte>
    <chapitre>
    <id>1.1</id>
    <titre>chap 1.1</titre>
    <texte>texte 1.1</texte>
    </chapitre>
    <chapitre>
    <id>1.2</id>
    <titre>chap 1.2</titre>
    <texte>texte 1.2</texte>
    <chapitre>
    <id>1.2.1</id>
    <titre>chap 1.2.1</titre>
    <texte>texte 1.2.1</texte>
    </chapitre>
    <chapitre>
    <id>1.2.2</id>
    <titre>chap 1.2.2</titre>
    <texte>texte 1.2.2</texte>
    </chapitre>
    <chapitre>
    <id>1.2.3</id>
    <titre>chap 1.2.3</titre>
    <texte>texte 1.2.3</texte>
    </chapitre>
    </chapitre>
    <chapitre>
    <id>1.3</id>
    <titre>chap 1.3</titre>
    <texte>texte 1.3</texte>
    </chapitre>
    </chapitre>
    <chapitre>
    <id>2</id>
    <titre>chap 2</titre>
    <texte>texte 2</texte>
    </chapitre>
    <chapitre>
    <id>3</id>
    <titre>chap 3</titre>
    <texte>texte 3</texte>
    </chapitre>
    </article>
    Et voici mon fichier fxsl.xsl
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <xsl:stylesheet xmlns:xsl = "http://www.w3.org/1999/XSL/Transform" version="1.0" >  
              <xsl:output method = "text" /> 
              <xsl:template match = "/" > 
     
    Actuel=<xsl:value-of select="//chapitre[id='1.3']/id"/>
              &lt;BR/>
     
    Precedent=<xsl:value-of select="//chapitre[id='1.3']/parent::*/id"/>
              &lt;BR/>
    Suivant=<xsl:value-of select="//chapitre[id='1.3']/following::*/id | //chapitre[id='1.3']/descendant::*/id "/><br/>
              </xsl:template>   
    </xsl:stylesheet>
    Le fait est que si je suis sur le chapitre dont l'id est 1.2.2 j'arrive à trouver que le suivant est 1.2.3 de meme lorsque je suis sur n'importe quel autre noeud.

    Mon problème viens surtout du noeud précedent. Dans le code que je vous donne je n'arrive juste que à trouver le noeud parent de celui sur lequel je me trouve. c'est à dire que si je suis sur 1.2.2 le précedent me trouvera 1.2 alors qu'il devrait me trouver 1.2.1....

    Je vois plus trop comment faire la....

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 12
    Points : 13
    Points
    13
    Par défaut
    je te le fais pas en code, trop peur d'écrire une bétise donc en pseudo code pour l'algo.
    Vérifier si position()!=1 pourrait ne pas y avoir d'élément précédent
    Si oui afficher l'élément fils du père (celui que tu trouves étant le père) de position égale à position()-1.
    dans ton exemple si ton noeud courant est 1.2.3, la fonction position() vaut 3!=1.
    le père est 1.2 et tu veux le fils du précédent tel qu'il soit en position 2


    le code devrait ressembler à ça mais je suis pas sur n'ayant pas ma doc sous les yeux de comment écrire la partie entre [].

    ../texte[position()-1]

  3. #3
    Membre expérimenté

    Profil pro
    Inscrit en
    Mai 2003
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2003
    Messages : 412
    Points : 1 326
    Points
    1 326
    Par défaut
    ok je vais voir ce que cela donne

    de mon coté j'ai trouvé grace à une connaissance un début de solution qui donne ca

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <xsl:value-of select="//chapitre[id=$num]/preceding::id[1]" />&lt;br>
    <xsl:value-of select="//chapitre[id=$num]/following::id[1]" />
    Cette solution marche presque partout. Le pb viens de quand je ne suis pas dans un chapitre mais dans article. Mais aussi si on tente la position 1 (il donne rien en previous et 2 en next alors qu'il devrait donner 1.1)
    si on tente 1.2 il donne 1.1 en previous ça c'est bon mais en enxt il donne 1.3 ça c'est plus bon car la il devrait donner 1.2.1)

    Je suis désolé si j'ai un peu de mal mais c mon premier xsl

  4. #4
    Rédacteur

    Avatar de Erwy
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2003
    Messages
    4 967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 967
    Points : 10 927
    Points
    10 927
    Par défaut
    tu veux faire quoi avec ton code?

    d'apres moi ta solution devrait se faire avec des parents,childnodes et precedent-sibling
    precedent et suivant c'est pas assez clair,parle tu des ascendant et descendant ou des noeuds de meme niveau etc.....

    ex je suis sur 1.2

    parent me donnera 1
    child 1.2.1,1.2.2,1.2.3
    precedent-sibling 1.1
    following-sibling 1.3(et s'ils existait 1.4,1.5 ........)
    lis le tuto
    http://jerome.developpez.com/xmlxsl/xpath/

  5. #5
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Bonjour,
    si on tente 1.2 il donne 1.1 en previous ça c'est bon mais en enxt il donne 1.3 ça c'est plus bon car la il devrait donner 1.2.1)
    C'est normal, c'est du à ta structure de fichier et au comportement de l'axe Following, qui donne les noeuds venant après le noeud contextuel, à l'exclusion de ses descendants
    Comme le chapitre 1.2.1 est un enfant de 1.2, il ne t'est pas renvoyé par ta commande XPath. Même problème avec preceding et les ancêtres.

    La solution ne va donc pas être triviale et dépendre du but recherché. A vue de nez, tu veux faire une navigation de chapitre en chapitre, non ?
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  6. #6
    Rédacteur

    Avatar de Erwy
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2003
    Messages
    4 967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 967
    Points : 10 927
    Points
    10 927
    Par défaut
    pdt que j'y pense indente ton fichier xml ca le rendra plus facile a lire parce que la pour voir quel noeud est fils de quel autre......

  7. #7
    Membre expérimenté

    Profil pro
    Inscrit en
    Mai 2003
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2003
    Messages : 412
    Points : 1 326
    Points
    1 326
    Par défaut
    Bon j'ai finalement trouvé

    Je vous donne la solution

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    --Pour le précédent
    <xsl:value-of select="//chapitre[id=$num]/preceding::id[1]" />
     
    --Pour le suivant
    <xsl:value-of select="//chapitre[id=$num]/following::id[1]| //chapitre[id=$num]/descendant::*/id" />
    Sachant que je passait en argument dans la variable num la valeur de mon id actuel

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. mise en page (Header and Footer) en XML-XSL.
    Par christine dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 01/03/2004, 16h31
  2. Pd de transformation XML/XSL sur un windows 2000 server US
    Par Sylvain Leray dans le forum XMLRAD
    Réponses: 3
    Dernier message: 24/03/2003, 11h00
  3. XML + XSL + PHP
    Par ZzZerf dans le forum XSL/XSLT/XPATH
    Réponses: 5
    Dernier message: 21/03/2003, 15h54
  4. xml -> xsl -> xml
    Par virgile04 dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 10/10/2002, 16h53
  5. Cours en Français sur XML-XSL et XPath
    Par Community Management dans le forum XSL/XSLT/XPATH
    Réponses: 0
    Dernier message: 25/04/2002, 15h46

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