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 :

application methode Muench sur attributs d'un noeud


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Candidat au Club
    Inscrit en
    Juin 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Juin 2008
    Messages : 5
    Points : 2
    Points
    2
    Par défaut application methode Muench sur attributs d'un noeud
    Bonjour à tous,

    je lance mon premier post avec un problème d'adaptation de la méthode Muench sur les attributs d'un noeud.

    Je suis encore novice avec le XSLT mais pensais pourtant pouvoir m'en sortir comme un grand en adaptant le concept de groupement sur les noeuds, déjà bien relayé sur différents tutos de Grandfather ... Hé bien, NON !!

    Voici un extrait allégé de mon fichier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <REFERENCE databank="databank1" id="id1">truc bidule</REFERENCE>
    <REFERENCE databank="databank3" id="id6">machin</REFERENCE>
    <REFERENCE databank="databank2" id="id4">comment</REFERENCE>
    ...
    <REFERENCE databank="databank1" id="id8">chose</REFERENCE>
    <REFERENCE databank="databank2" id="id2">no idea</REFERENCE>
    ... que je voulais transformer en :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    <ref_databank1>
         <id>id1</id>
         <id>id8</id>
         ...
    </ref_databank1>
    <ref_databank2>
         <id>id2</id>
         <id>id4>
         ...
    </ref_databank2>
    ...


    Je fais peut être fausse route; n'applique pas la bonne méthode ou pas correctement mais voici mon code qui en fait n'affiche que la liste des databank et non pas la liste des id correspondants.
    En gros; mon code qui ne marche pas :

    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
     
    <?xml version="1.0"?>
     
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml" version="1.0">
     
    	<xsl:key name="databank" match="//REFERENCE" use="@databank"/>
    	<xsl:key name="id" match="//REFERENCE" use="@id"/>
     
    <xsl:template match="/ENTRY">
     
    <ENTRY>
     
     
    	<xsl:for-each select="//REFERENCE[generate-id(.)=generate-id(key('databank',@databank)[1])]">
    		<xsl:sort select="@databank"/>
    		<xsl:variable name="current_databank" select="@databank"/>
     
    		<xsl:element name="ref_{$current_databank}">
     
    		<xsl:for-each select="//REFERENCE[generate-id(.)=generate-id(key('id',@id)[preceding-sibling:://REFERENCE/@databank=$current_databank][1])]">
    		<xsl:sort select="@id"/>
    			<xsl:element name="id">
    				<xsl:value-of select="@id"/>
    			</xsl:element>		
    		</xsl:for-each>
     
    		</xsl:element>
    	</xsl:for-each>
     
     
    </ENTRY>
     
    </xsl:template>
     
    </xsl:stylesheet>

    Voilà, en espérant avoir été clair. Pke mes neurones ne le sont plus trop.
    Par avance, merci !

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

    tu n'étais pas très loin, il fallait juste poursuivre ton objectif de départ jusqu'au bout, travailler sur les attributs et non les éléments.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <xsl:key name="databank" match="//REFERENCE/@databank" use="."/>
    ...
    <xsl:for-each select="//REFERENCE/@databank[generate-id()=generate-id(key('databank', .)[1])]">
    ...
    <xsl:for-each select="key('databank', current())/../@id">
    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

  3. #3
    Candidat au Club
    Inscrit en
    Juin 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Juin 2008
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    YouUhOuu ça marche impec !

    Super merci Grandfather !!
    Pour avoir lu tes précédents posts sur le sujet; je me doutais bien que t'aurais ma réponse. Et de surcroit, très rapide

    Visiblement, j'ai pas encore compris tous les concepts du XSLT.
    Cependant, j'ai pu voir que le XSLT 2 était plus souple au niveau des regroupements, élimination doublons, etc. Ça mériterait peut être que je m'y attarde un peu prochainement.

    Sinon, simple question; quelle est concrètement la différence entre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <xsl:key name="databank" match="//REFERENCE/@databank" use="."/>
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <xsl:key name="databank" match="//REFERENCE" use="@databank"/>
    Merci encore

  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
    Ils n'indexent tout simplement pas les mêmes noeuds ; la première indexe les attributs databank par leur contenu, tandis que la deuxième indexe les éléments REFERENCE par le contenu de leur attribut databank.

    Effectivement, XSLT 2.0 permet de faire des regroupements bien plus facilement, sans utiliser la méthode Muench.
    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
    Candidat au Club
    Inscrit en
    Juin 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Juin 2008
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Ok GrandFather. C'est maintenant clair.

    Merci. Et sûrement à bientôt !

  6. #6
    Candidat au Club
    Inscrit en
    Juin 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Juin 2008
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Bonjour à tous,

    Je relance mon post pour un souci similaire au précédent mais dans une configuration légèrement différente.

    Puisqu'un exemple vaut mieux qu'un long discours; voici la partie du xml que je manipule :

    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
     
         <type value="mRNA">
              <db_xref db="Nucleotide" id="AK1"/>
              <db_xref db="Protein" id="AK2"/>
              <db_xref db="Nucleotide" id="AK3"/>
              ...
         </type>
     
         <type value="Genomic">
              <db_xref db="Protein" id="AK6"/>
              <db_xref db="Protein" id="AK4"/>
              <db_xref db="Nucleotide" id="AK5"/>
              ...
         </type>
     
         ...
    Voilà en quoi je voulais le transformer :

    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
     
         <seq_mRNA>
     
              <Nucleotide_entry>
                   <crossref>AK1</crossref>
                   <crossref>AK3</crossref>
              </Nucleotide_entry>
     
              <Protein_entry>
                   <crossref>AK2</crossref>
              </Protein_entry>
     
         </seq_mRNA>
     
     
         <seq_Genomic>
     
              <Nucleotide_entry>
                   <crossref>AK5</crossref>
              </Nucleotide_entry>
     
              <Protein_entry>
                   <crossref>AK4</crossref>
                   <crossref>AK6</crossref>
              </Protein_entry>
     
         </seq_Genomic>
     
         ...

    Malheureusement, par mon code qui suit (application de Muench toujours) :

    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
     
    <?xml version="1.0"?>
     
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml" version="1.0">
     
         <xsl:key name="databank" match="//type/db_xref/@db" use="."/>
     
    <xsl:template match="/ENTRY">
     
    <ENTRY>
     
         <xsl:for-each select="//type">
              <xsl:variable name="type" select="@value"/>
     
              <xsl:element nam="seq_{$type}">
     
              <xsl:for-each select="./db_xref/@db[generate-id()=generate-id(key('databank', .)[1])]">
                   <xsl:sort select="@db"/>
                   <xsl:variable name="current_databank" select="@db"/>
     
                   <xsl:element name="{$current_databank}_entry">
     
                   <xsl:for-each select="key('databank', current())/../@id">
                        <crossref><xsl:value-of select="@id"/></crossref>
    		</xsl:for-each>
     
    		</xsl:element>
              </xsl:for-each>
              </xsl:element>
     
         </for-each> 
    </ENTRY>
     
    </xsl:template>
     
    </xsl:stylesheet>
    j'obtiens ceci :

    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
     
         <seq_mRNA>
     
              <Nucleotide_entry>
                   <crossref>AK1</crossref>
                   <crossref>AK3</crossref>
                   <crossref>AK5</crossref>
              </Nucleotide_entry>
     
              <Protein_entry>
                   <crossref>AK2</crossref>
                   <crossref>AK4</crossref>
                   <crossref>AK6</crossref>
              </Protein_entry>
     
         </seq_mRNA>
     
         </seq_Genomic>
         </seq_Other>
     
         ...
    En gros, je regroupe bien les attributs comme GrandFather me l'a appris, cependant, je perds la notion d'ancêtres auxquels ils sont raccordés.

    J'ai essayé également d'autres manières, en repassant par exemple le nom de l'attribut @db dans le path "type[@db=$type]/db_xref" ou dans la condition, mais en vain
    Je ne vois pourtant pas de difficulté supplémentaire par rapport à mon post précédent...

    Si quelqu'un tu pouvait m'expliquer de nouveau où se trouve mon erreur; il m'épargnerait quelques cellules grises

    Merci

  7. #7
    Candidat au Club
    Inscrit en
    Juin 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Juin 2008
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Salut à tous

    C'est bon, résolu comme un grand
    La persévérance paie finalement.

    Je lâche mon code; ça pourrait intéresser quelqu'un...

    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
     
    <xsl:key name="db" match="//type/@value" use="."/>
    <xsl:key name="type" match="//type/db_xref/@db" use="."/>
     
    ...
     
    <xsl:for-each select="//type/@value[generate-id(.)=generate-id(key('type', .)[1])]">
     
         <xsl:variable name="type" select="."/>
     
         <xsl:element name="seq_{$type}">
     
         <xsl:for-each select="//db_xref/@db[generate-id(.)=generate-id(key('db',.)[ancestor::type/@value=$type][1])]">
              <xsl:variable name="current_databank" select="."/>
     
              <xsl:element name="{$current_databank}_entry">
     
              <xsl:for-each select="key('db',current())/../@id [ancestor::type/@value=$type]">
                   <xsl:sort select="@id"/>
                   <xsl:element name="crossref"><xsl:value-of select="."/></xsl:element>
              </xsl:for-each>
     
              </xsl:element>
         </xsl:for-each>
         </xsl:element>
    </xsl:for-each>

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

Discussions similaires

  1. application de methode agile sur un projet decisionnel
    Par noussa2011 dans le forum Méthodes Agiles
    Réponses: 2
    Dernier message: 20/02/2012, 11h54
  2. Réponses: 5
    Dernier message: 06/09/2010, 16h10
  3. application qui connecte sur une page web
    Par spoolz dans le forum Entrée/Sortie
    Réponses: 6
    Dernier message: 14/04/2004, 09h47
  4. Retrouver les attributs d'un noeud...
    Par LLaurent dans le forum XMLRAD
    Réponses: 2
    Dernier message: 18/12/2003, 09h20
  5. Réponses: 7
    Dernier message: 17/07/2003, 11h00

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