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 :

[XSLT] Comparaison 2 documents XML?


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 19
    Points : 17
    Points
    17
    Par défaut [XSLT] Comparaison 2 documents XML?
    Bonjour,

    J'ai un document XML composé des éléments : "Terme" et "Definition".
    Il y a des termes dans ce document dont je souhaiterais exclure.

    J'ai pensé alors à une liste "Stop" au format XML contenant les termes indésirables pour que via une feuille XSLT fait une comparaison entre le document XML et la liste ainsi le nouvel document XML affiche tout sauf ce qui se trouve dans la liste!

    Est-ce que c'est faisable ou je me complique la vie (pour le moment j'ai l'impression que je me complique la vie car je ne trouve pas la solution )?

    Merci

  2. #2
    Expert confirmé
    Avatar de emmanuel.remy
    Inscrit en
    Novembre 2005
    Messages
    2 855
    Détails du profil
    Informations personnelles :
    Âge : 55

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 855
    Points : 4 045
    Points
    4 045
    Par défaut
    J'ai un document XML composé des éléments : "Terme" et "Definition".
    Je suppose que tu ne peux pas toucher à ce doc ? Si c'est le cas il va bien falloir inscrire cette liste de "Stop Words" quelque part ?

    Donc ce que tu proposes a évidemment un sens.

    Tu peux très bien effectuer une transformation XSLT pour supprimer les "Termes" superflus.
    Et tu peux même te simplifier la vie en mettant ces termes directement dans ton doc XSL (par exemple sous la forme d'une variable).



    ERE
    Quand une tête pense seule, elle devient folle.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 19
    Points : 17
    Points
    17
    Par défaut
    Effectivement je ne peux pas toucher au doc :-)
    Merci emmanuel.remy, ça me rassure dans mon choix :-)

    Par contre, depuis hier je n'arrive pas à faire fonctionner la feuille XSLT.
    Dans le nouveau document, il y a toujours les mots indésirables : Soit c'est une erreur de raisonnement, soit c'est une erreur syntaxique.

    Le document XML se presente de cette manière:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <?xml version="1.0" encoding="UTF-8" ?>
    <tree>
      <node>
        <terme>Terme 1</terme>
        <description>Def 1 .... </description>
       </node>  
     
       <node>
        <terme>terme 2</terme>
        <description>Def 2 .....</description>
       </node>   
    </tree>
    La feuille XSLT que j'essaie de faire fonctionner sans succès :
    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
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="xml" encoding="UTF-8" indent="yes" />
     
    <xsl:template match="node">
     
    <!-- Liste "Stop"-->
    <xsl:variable name="mots">
    <lab>Terme 2</lab>
    <lab>Terme 4</lab>
    <lab>Terme 100</lab>
    </xsl:variable>
     
    <xsl:for-each select = "current()[not (xsl:variable[@name='mots']/*)]">
    <label><xsl:value-of select="terme"/></label>
    <descr><xsl:value-of select="description"/></descr>
    </xsl:for-each>
    </xsl:template>
    </xsl:stylesheet>
    Ceci ne fonctionne pas non plus :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <xsl:if test = "terme != $mots">
    <label><xsl:value-of select="terme"/></label>
    <descr><xsl:value-of select="description"/></descr>
    </xsl:if>
    ça fonctionne que quand je fait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    <xsl:template match="node">
    <xsl:variable name="mot1">Terme 2</xsl:variable>
    <xsl:variable name="mot2">Terme 4</xsl:variable>
     
    <xsl:if test = "(terme != $mot1) and (terme != $mot2)">
     <label><xsl:value-of select="terme"/></label>
     <descr><xsl:value-of select="description"/></descr>
    </xsl:if>
    </xsl:template>
    Bien sûr ce n'est pas une solution souhaitable car si on a 100 termes à exclure, ça veut dire 100 variables à exclure !!

    Je suis perdue dans tout ça. Si quelqu'un pourra m'éclairer, ça sera génial!!

    Merci

  4. #4
    Expert confirmé
    Avatar de emmanuel.remy
    Inscrit en
    Novembre 2005
    Messages
    2 855
    Détails du profil
    Informations personnelles :
    Âge : 55

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 855
    Points : 4 045
    Points
    4 045
    Par défaut
    Salut,

    Pourquoi ne pas mettre tous les stop words dans un fichier XML à part (plus simple pour la maintenance) ? Ensuite tu peux les sélectionnés et les parcourir par un:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    document('stopwords.xml'))//lab"
    Il te suffit de vérifier au moment de la transformation que le node traité n'est pas dans la liste des stop words.

    ERE
    Quand une tête pense seule, elle devient folle.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 19
    Points : 17
    Points
    17
    Par défaut
    Salut,

    J'ai essayé les deux : avec une variable ou avec un fichier XML distinct mais à chaque fois c'est le même problème : il n'enlève que la première balise :

    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
     
    <xsl:variable name="doc">
     <xsl:for-each select="document('stopWords.xml')/tree">
       <xsl:value-of select="*"/>
     </xsl:for-each>
    </xsl:variable>
     
    <xsl:template match="tree">
    <Glossaire>
      <xsl:for-each select="node">
        <xsl:if test= "terme != $doc">
           <label><xsl:value-of select="terme"/></label>
           <descr><xsl:value-of select="description"/></descr>
        </xsl:if>
       </xsl:for-each>
    </Glossaire>	
    </xsl:template>
    Si dans stopWords.xml, j'ai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    <?xml version="1.0" encoding="UTF-8"?> 
     
    <tree>
    <label>Terme A</label>
    <label>Terme B</label>
    <label>Terme Z</label>
    </tree>
    Je n'ai en résultat que Terme A d'enlever !!

    J'ai beau tourner le pb dans tous les sens, je n'arrive pas à détecter ce qui ne va pas !! Je désespère

  6. #6
    Expert confirmé
    Avatar de emmanuel.remy
    Inscrit en
    Novembre 2005
    Messages
    2 855
    Détails du profil
    Informations personnelles :
    Âge : 55

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 855
    Points : 4 045
    Points
    4 045
    Par défaut
    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
     
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="xml" encoding="UTF-8" indent="yes" />
     
    <xsl:variable name="sw" select="document('stopWords.xml')//label" />
     
    <xsl:template match="tree">
    <Glossaire>
      <xsl:for-each select="node">
        <xsl:if test= "not($sw[text()=current()/terme])">
           <label><xsl:value-of select="terme"/></label>
           <descr><xsl:value-of select="description"/></descr>
        </xsl:if>
       </xsl:for-each>
    </Glossaire>	
    </xsl:template>
    </xsl:stylesheet>
    avec les stopwords ainsi:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <?xml version="1.0" encoding="UTF-8"?> 
    <tree>
      <label>Terme A</label>
      <label>Terme B</label>
      <label>Terme Z</label>
    </tree>
    ERE
    Quand une tête pense seule, elle devient folle.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 19
    Points : 17
    Points
    17
    Par défaut
    WoOoOW
    Et dire que ça fait plus de 2 jours que je me bats avec des if et des current() et des variables ... :-) Et finalement, c'était un problème de condition :-)

    En tout cas, tout ce que j'ai pu essayé et réessayé n'est pas perdu puisque ça me permet d'avancer, d'apprendre, etc.

    Je te remercie énormément emmanuel.remy!

    Au plaisir de rediscuter avec toi et qui sait, peut-être, un jour t'aider à résoudre un problème en XSLT

  8. #8
    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,

    on peut même se passer du xsl:if
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <xsl:for-each select="node[not(terme = $sw)]">
      <label><xsl:value-of select="terme"/></label>
      <descr><xsl:value-of select="description"/></descr>
    </xsl:for-each>
    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

  9. #9
    Expert confirmé
    Avatar de emmanuel.remy
    Inscrit en
    Novembre 2005
    Messages
    2 855
    Détails du profil
    Informations personnelles :
    Âge : 55

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 855
    Points : 4 045
    Points
    4 045
    Par défaut Question subsidiaire
    Citation Envoyé par GrandFather Voir le message
    Bonjour,

    on peut même se passer du xsl:if
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <xsl:for-each select="node[not(terme = $sw)]">
      <label><xsl:value-of select="terme"/></label>
      <descr><xsl:value-of select="description"/></descr>
    </xsl:for-each>
    Salut GrandFather,
    Pour mon info, je ne comprends pas ton terme = $sw; on peut comparer un élément unique (ici terme) avec une collection d'éléments ($sw qui vaut un //label) ? Il les comparent entre eux ?

    ERE
    Quand une tête pense seule, elle devient folle.

  10. #10
    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
    Tout à fait, et c'est une des particularités parmi les plus puissantes et les plus méconnues de XPath.

    Dans un test avec un opérateur de comparaison (=, !=, <, <=, >, >=), quand l'un des termes est une valeur scalaire et l'autre un nodeset, le résultat est vrai quand il existe au moins un noeud dans le nodeset pour lequel la comparaison revoit vrai. Selon cette définition, il est d'ailleurs intéressant de noter que a != b ne renverra pas forcément le même résultat que not(a = b).

    Cela permet d'exprimer très facilement, en une seule expression XPath, des fonctions telles que min() et max(). Par exemple, pour trouver la valeur minimum parmi des éléments element frères, il suffira d'écrire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    //element[not(../element &lt; .)]
    La simplicité de l'expression ne doit cependant pas faire oublier que ce n'est pas optimal sur le plan des performances, sa complexité étant quadratique. Une fonction min() codée avec quelques instructions en XSLT sera elle de complexité linéaire.
    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

  11. #11
    Membre expérimenté
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    1 466
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 466
    Points : 1 610
    Points
    1 610
    Par défaut
    C'est toujours un plaisir de te lire GrandFather, merci .

  12. #12
    Expert confirmé
    Avatar de emmanuel.remy
    Inscrit en
    Novembre 2005
    Messages
    2 855
    Détails du profil
    Informations personnelles :
    Âge : 55

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 855
    Points : 4 045
    Points
    4 045
    Par défaut
    J'adore ces forums !

    Merci GrandFather !

    ERE
    Quand une tête pense seule, elle devient folle.

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 19
    Points : 17
    Points
    17
    Par défaut
    Merci pour votre aide et toutes ces précisions

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

Discussions similaires

  1. [XSLT] Filtrer un document XML
    Par BakaOnigiri dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 06/01/2011, 10h33
  2. [XSLT]Recopie de document XML
    Par khamkham dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 06/04/2010, 14h16
  3. [XSLT] Transformer un Document XML
    Par merlinerick dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 24/05/2009, 17h16
  4. [XSLT] Filtrer un document XML sur seulement certains noeuds
    Par Tino13 dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 28/05/2007, 18h11
  5. [XSLT]select sur plusieur documents XML
    Par jesus144 dans le forum XMLRAD
    Réponses: 3
    Dernier message: 15/06/2005, 10h56

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