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

  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
    Points : 786
    Points
    786
    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
    Points : 786
    Points
    786
    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
    Points : 786
    Points
    786
    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 é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,

    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
    Points : 786
    Points
    786
    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 é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
    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
    Points : 786
    Points
    786
    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

  8. #8
    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
    deja un truc que je ne capte pas:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ID[preceding-sibling::TYPE
    alors que dans ton xml type est après

    Ensuite, sur le genrate-id , ce que grandfather essayait de t'expliquer c'est que ton idée de départ etait totalement fausse puisque ce qui entre dans la composition du resultat d'un generate-id est le document auquel il appartient .Deux xml appelés dans le même xslt ne peuvent avoir de generate-id commun

  9. #9
    Membre éclairé Avatar de luta
    Inscrit en
    Novembre 2003
    Messages
    1 038
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 038
    Points : 786
    Points
    786
    Par défaut
    Citation Envoyé par Erwy
    deja un truc que je ne capte pas:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ID[preceding-sibling::TYPE
    alors que dans ton xml type est après
    oui c est parce que la structure est un peu plus compliqué donc j ai tenté de simplifier...en y commettant une erreur mais le raisonnement est bon... désolé

    Citation Envoyé par Erwy
    Ensuite, sur le genrate-id , ce que grandfather essayait de t'expliquer c'est que ton idée de départ etait totalement fausse puisque ce qui entre dans la composition du resultat d'un generate-id est le document auquel il appartient deux xml appelé dans le même xslt ne peuvent avoir de generate-id commun
    j avous ne pas avoir compris..." le document auquel il appartient deux xml appelé dans le même xslt "

  10. #10
    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
    Citation Envoyé par luta
    j avous ne pas avoir compris..." le document auquel il appartient deux xml appelé dans le même xslt "
    Manque un point

    Pour caricaturer

    Soit ton xml courant tous les generate-id seront prefixé A
    Sois le xml que tu appelle dans ton xslt tous les generate-id seront prefixé B
    Donc aucun generate-id commun.
    Le generate-id ne fabrique aucunement en fonction du contenu d'un noeud mais de son emplacement memoire.Ce qui fait que deux utilisations consecutives d'un même xslt sur un meme xml ne produisent pas les même generate-id

  11. #11
    Membre éclairé Avatar de luta
    Inscrit en
    Novembre 2003
    Messages
    1 038
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 038
    Points : 786
    Points
    786
    Par défaut
    hummmm
    nous sommes bien d accord que je parle bien du même noeud du même document.
    imaginons la structure suivante qq part ds un arbre
    un test du type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:if test="//generate-id(A/B[.='une valeur']) = //generate-id(A/C[.='une autre valeur'])  "/>
    ne sera pas vérifié?

    excusez moi si c est un peu confus

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