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 :

Requête XPATH preceding-sibling [XPATH 1.0]


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 116
    Points : 66
    Points
    66
    Par défaut Requête XPATH preceding-sibling
    Bonjour,

    Je cherche à faire un traitement particulier en XSL et pour cela il me faut une requête particulière que je n'arrive pas à faire.

    Mon code XML est

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <L1>
         <PARA></PARA>
         <NOTA>
               <PARA></PARA>
         <NOTA></NOTA> 
    </L1>
    <L1>
    </L1>
    Je me trouve dans le second L1 et je veux tester si dans le frère précédent L1 si j'ai un fils NOTA en dernière position.

    Pour cela j'ai fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <xsl:if test="preceding-sibling::*[1][child::*[last()][self::NOTA]]">
         <!-- traitement -->
    </xsl:if>
    Mais cela ne fonctionne pas ...

    Est-ce que vous auriez une idée, est-ce que je fait une erreur de syntaxe?

    Merci par avance de votre réponse.

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 564
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 564
    Points : 21 629
    Points
    21 629
    Par défaut
    Citation Envoyé par cris83500 Voir le message
    Mon code XML est

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <L1>
         <PARA></PARA>
         <NOTA>
               <PARA></PARA>
         <NOTA></NOTA> 
    </L1>
    <L1>
    </L1>
    Il est mal formé : le premier <NOTA> n'est jamais fermé.


    Citation Envoyé par cris83500 Voir le message
    Je me trouve dans le second L1 et je veux tester si dans le frère précédent L1 si j'ai un fils NOTA en dernière position.

    Pour cela j'ai fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <xsl:if test="preceding-sibling::*[1][child::*[last()][self::NOTA]]">
         <!-- traitement -->
    </xsl:if>
    Mais cela ne fonctionne pas ...
    Ça devrait. Tu peux nous montrer un exemple court et complet (XML court et complet + XSLT courte et complète à appliquer dessus) qui prouve que ça marche pas ?

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 116
    Points : 66
    Points
    66
    Par défaut
    Merci de té réponse,

    petite erreur de ma part il ne devait pas se ré-ouvrir.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <L1>
         <PARA></PARA>
         <NOTA>
               <PARA></PARA>
         </NOTA> 
    </L1>
    <L1>
    </L1>
    Après pour du code complet c'est ça en version schématisé.
    Ma question est que si vous êtes dans ce cas comment feriez-vous pour tester si l'élément frère précédent du second L1 se termine par un NOTA.

    Le traitement que j’effectue dans ce if est seulement l'attribution d'une marge différente a ma seconde liste L1 si elle se trouve dans ce cas.
    Cela ne marche pas car la marge que j'essaye d'attribuer n'est pas prise en compte.

    J'espère que vous pourriez m'aider avec ces explications.

    Merci par avance de vos réponses.

  4. #4
    Expert confirmé
    Avatar de Loceka
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    2 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 2 276
    Points : 4 843
    Points
    4 843
    Par défaut
    Ce que t'a dit thelvin c'est que le test que tu fais dans ton if est tout fait correct. C'est l'endroit où il est utilisé qui ne doit pas être bon.

    Donc si tu veux de l'aide il va falloir nous donner plus de code.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 116
    Points : 66
    Points
    66
    Par défaut
    Je ne pense pas qu'il soit correcte mon texte du moins syntaxiquement peut-être mais il ne donne pas le résultat voulu.

    J'y suis toujours et déjà j'ai remarqué qu'il manque le L1 dedans ... ainsi que position().
    Donc pour l'instant j'en suis à :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <xsl:if test="preceding-sibling::*[1][child::L1/*[position()=last()][self::NOTA]]">
         <!-- traitement -->
    </xsl:if>
    Après je ne vois vraiment pas quoi vous fournir de plus pour vous aidez, à part ça. Moi je pense que c'est ma syntaxe ou mon enchainement qui n'est pas bon.

    Est-ce dans mon cas je prend bien le fils précédent L1 déjà? j'ai déjà des doutes sur cela.

    Merci quand même de vos réponses en espérant que vous pourriez quand même m'aider.

  6. #6
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 564
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 564
    Points : 21 629
    Points
    21 629
    Par défaut
    Citation Envoyé par cris83500 Voir le message
    Après pour du code complet c'est ça en version schématisé.
    Et c'est très bien, c'est comme ça qu'on fait court.
    Mais même si c'est schématisé, il faut que ce soit complet : que le XML soit bien formé, et que le XSLT ait un élément <xsl:stylesheet>. Bref, on le prend, on le lance, et on voit ce qui se passe.

    Citation Envoyé par cris83500 Voir le message
    Je ne pense pas qu'il soit correcte mon texte du moins syntaxiquement peut-être mais il ne donne pas le résultat voulu.
    Si, à moins que les éléments frères puissent être autre chose que des L1.

    Citation Envoyé par cris83500 Voir le message
    J'y suis toujours et déjà j'ai remarqué qu'il manque le L1 dedans
    A priori un <L1> ne peut avoir que des éléments <L1> comme frères, non ?
    S'il peut y avoir autre chose, il faut adapter, en effet...

    Citation Envoyé par cris83500 Voir le message
    ... ainsi que position().
    Pas besoin d'utiliser position() puisque tu cherches un précédent et un dernier...

    Citation Envoyé par cris83500 Voir le message
    Donc pour l'instant j'en suis à :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <xsl:if test="preceding-sibling::*[1][child::L1/*[position()=last()][self::NOTA]]">
         <!-- traitement -->
    </xsl:if>
    Ça ne ressemble pas à ce que tu demandes. Là tu cherches si le précédent nœud frère a un fils <L1> dont le dernier élément est <NOTA>.

    Citation Envoyé par cris83500 Voir le message
    Après je ne vois vraiment pas quoi vous fournir de plus pour vous aidez, à part ça.
    Citation Envoyé par thelvin
    Tu peux nous montrer un exemple court et complet (XML court et complet + XSLT courte et complète à appliquer dessus) qui prouve que ça marche pas ?
    Citation Envoyé par cris83500 Voir le message
    Moi je pense que c'est ma syntaxe ou mon enchainement qui n'est pas bon.
    C'est de l'informatique. Il n'y a pas lieu de croire, il suffit de prouver. Soit tu prouves que oui, soit tu prouves que non.

    Citation Envoyé par cris83500 Voir le message
    Est-ce dans mon cas je prend bien le fils précédent L1 déjà? j'ai déjà des doutes sur cela.
    C'est quoi un "fils précédent" ?

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 116
    Points : 66
    Points
    66
    Par défaut
    Pour les données c'était difficiles de vous en fournir d'avantages d'où ma manière de synthétiser le problème.

    Mais j'ai quand même réussi à régler enfin mon problème qui vient du fait que je me trompais dans l'appel à mes balises, c'était pas NOTA mais NOTE (je sais c'est pas très malin ...).

    Donc pour résoudre mon problème j'ai utilisé le test (je la met car je trouve qu'il manque un peu d'exemple de requête de ce style) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
    <xsl:if test="preceding-sibling::*[1][self::L1/child::*[last()][self::NOTE]]">
         <!-- traitement -->
    </xsl:if>
    En tous cas merci de vos réponses qui m'ont permis de trouver mon erreur car c'était bizarre que cela ne fonctionne pas alors que c'était bon d’après vous.

  8. #8
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 564
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 564
    Points : 21 629
    Points
    21 629
    Par défaut
    Citation Envoyé par cris83500 Voir le message
    Pour les données c'était difficiles de vous en fournir d'avantages d'où ma manière de synthétiser le problème.
    Voilà un exemple de comment on fait :

    XSLT:
    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
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     
      <xsl:template match="L1">
        <xsl:copy>
          <xsl:if test="preceding-sibling::*[1][child::*[last()][self::NOTA]]">
            <xsl:attribute name="precedent-se-termine-par-NOTA">oui</xsl:attribute>
          </xsl:if>
          <xsl:apply-templates/>
        </xsl:copy>
      </xsl:template>
     
      <xsl:template match="node()">
        <xsl:copy>
          <xsl:apply-templates/>
        </xsl:copy>
      </xsl:template>
     
    </xsl:stylesheet>
    À appliquer sur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <ROOT>
    <L1>
         <PARA></PARA>
         <NOTA/>
               <PARA></PARA>
         <NOTA></NOTA>
    </L1>
    <L1>
    </L1>
    </ROOT>
    Et nous avons prouvé que le XPath donné fonctionne correctement.

    Je n'ai pas fourni plus de données. Ce sont des données schématiques. La différence, c'est qu'on peut les prendre telles quelles, les lancer telles quelles, et voir le résultat. Ce résultat prouve si oui ou non, ça marche.

    La prochaine fois, fais comme ça.

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 116
    Points : 66
    Points
    66
    Par défaut
    Merci de cet exemple,

    Le prochaine fois j’essaierai de faire comme cela.

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

Discussions similaires

  1. [XPath] preceding-sibling plusieurs criteres
    Par tralloc dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 17/11/2009, 11h28
  2. XPath Différence entre preceding et preceding-sibling
    Par FwRamaro dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 16/07/2008, 11h15
  3. [xml] Xpath besoin d'explication sur preceding-sibling::
    Par ekmule dans le forum XSL/XSLT/XPATH
    Réponses: 7
    Dernier message: 10/01/2006, 09h32
  4. [XPATH] following-sibling probleme
    Par luta dans le forum XSL/XSLT/XPATH
    Réponses: 10
    Dernier message: 01/12/2005, 15h02
  5. [XML] Requête Xpath
    Par Raylemon dans le forum Langage
    Réponses: 1
    Dernier message: 02/07/2005, 15h58

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