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 :

[XSL] test d égalité


Sujet :

XSL/XSLT/XPATH XML

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de luta
    Inscrit en
    Novembre 2003
    Messages
    1 038
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 038
    Par défaut [XSL] test d égalité
    bonjour j ai 2 docs XML que je dois comparer, les objets s ont écris de la sorte:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <root><obj>
      <id>1</id>
      <type>objet</type>
      <autres_champs>...</autres_champs>
    </obj>
    <obj..../>
    </root>
    je dois récupérer tous les éléments obj dont (la clef est composée de id et type)
    qui ne sont pas dans mon doc courant(je ne prend en compte que id et type)...le problème est que je ne sais pas tester sur 2 champs sans perdre le noeud contextuel.
    merci

  2. #2
    Membre éclairé Avatar de luta
    Inscrit en
    Novembre 2003
    Messages
    1 038
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 038
    Par défaut
    une petite idée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <xsl:for-each select="document($DocToCompare)//root">
      <xsl:choose>
        <xsl:when test="Obj[generate-id($currentDoc//*[TYPE=current()/TYPE])= generate-id($currentDoc//*[ID =current()/ID]) ]">
        </xsl:when>
        <xsl:otherwise><xsl:copy-of select="."/></xsl:otherwise>
      </xsl:choose>
    </xsl:for-each>
    cela ne semble pas fonctionner...

  3. #3
    Membre éclairé Avatar de luta
    Inscrit en
    Novembre 2003
    Messages
    1 038
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 038
    Par défaut
    je met la solution que j ai trouvé pour la postérité
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <xsl:for-each select="document($DocToCompare)//root/Obj">
      <xsl:choose>
        <xsl:when test="ID=$currentDoc//ID[preceding-sibling::TYPE=current()/TYPE] ">
        </xsl:when>
        <xsl:otherwise><xsl:copy-of select="."/></xsl:otherwise>
      </xsl:choose>
    </xsl:for-each>
    ça à l 'air de bien marcher

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

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Par défaut
    Bonjour,

    generate-id() ne renvoie un ID unique pour chaque noeud au sein du même document, il ne peut pas être utilisé pour faire des comparaisons inter-documents.

    On peut en principe faire un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <xsl:variable name="other-doc" select="document($DocToCompare)//root"/>
    ...
    <xsl:copy-of select="$other-doc/obj[id != current()/id or type != current()/type]"/>
    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

  5. #5
    Membre éclairé Avatar de luta
    Inscrit en
    Novembre 2003
    Messages
    1 038
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 038
    Par défaut
    salut GrandFather
    1/ je crois que la condition que tu testes sera toujours vraie tout d abord
    2/ je voulais utiliser generate-id() justement pour être sûr que je ciblais le même noeud (mais deux fils différents bien sûr)

  6. #6
    Expert confirmé
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 55

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Par défaut
    Citation Envoyé par luta
    1/ je crois que la condition que tu testes sera toujours vraie tout d abord
    Je ne crois pas, non. Pour que la copie du noeud se fasse, il faut que le prédicat renvoie TRUE, donc il faut que l'id de l'objet soit différent de l'id courant ou que le type de l'objet soit différent du type courant. Pour que l'objet ne soit pas copié, le prédicat doit renvoyer FALSE, ce qui est la négation de la formule précédente : l'id de l'objet est égal à l'id courant et le type de l'objet est égal au type courant.
    Citation Envoyé par luta
    2/ je voulais utiliser generate-id() justement pour être sûr que je ciblais le même noeud (mais deux fils différents bien sûr)
    Désolé, j'avais mal vu... Mais ça ne change pas le fait que generate-id() soit inutile ici.
    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

  7. #7
    Membre éclairé Avatar de luta
    Inscrit en
    Novembre 2003
    Messages
    1 038
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 038
    Par défaut
    Je ne crois pas, non. Pour que la copie du noeud se fasse, il faut que le prédicat renvoie TRUE, donc il faut que l'id de l'objet soit différent de l'id courant ou que le type de l'objet soit différent du type courant. Pour que l'objet ne soit pas copié, le prédicat doit renvoyer FALSE, ce qui est la négation de la formule précédente : l'id de l'objet est égal à l'id courant et le type de l'objet est égal au type courant.
    oui..mais qui dit que l objet que tu testes de l autre doc n a pas un type ou id identique...à l objet suivant...
    enfin bref la solution que j ai trouvé semble marcher
    merci

Discussions similaires

  1. [XSL] Test sur le nom d'une balise
    Par KibitO dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 18/12/2005, 13h44
  2. [XSL] test when: meilleure rédaction
    Par luta dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 26/10/2005, 11h22
  3. [XSL] test égalité entre nodes
    Par luta dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 10/10/2005, 17h40
  4. xsl : test sur les chaine de caractère
    Par yos dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 13/07/2005, 15h43
  5. xsl:test .... avec comportement bizarre
    Par Blue LC dans le forum XMLRAD
    Réponses: 2
    Dernier message: 10/06/2005, 13h56

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