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 :

Réunion de fils différents ayant le même père [XSLT 1.0]


Sujet :

XSL/XSLT/XPATH XML

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Octobre 2013
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2013
    Messages : 28
    Par défaut Réunion de fils différents ayant le même père
    Bonjour,
    Je dispose dans un fichier d'une suite d'élément de la forme suivante :
    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
     
    <word value="mot1">
      <racine value="racine1">
        <forme value="forme1"/>
      </racine>
    </word>
     
    <word value="mot1">
      <racine value="racine2">
        <forme value="forme2"/>
      </racine>
    </word>
     
    <word value="mot1">
      <racine value="racine2">
        <forme value="forme3"/>
      </racine>
    </word>
     
    <word value="mot2">
      <racine value="racine2">
       <forme value="forme3"/>
      </racine>
    </word>
     
    ....
    et j'aimerais obtenir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    <word value="mot1">
     <racine value="racine1">
        <forme value="forme1"/>
     </racine>
      <racine value="racine2">
        <forme value="forme2"/>
        <forme value="forme3"/>
      </racine>
    </word>
    Pour l'instant j'ai réussi à obtenir la liste unique des "<word value="mot">" mais cela ne me fournit que le premier bloc rencontré et non pas la liste des sous éléments (donc la racine et la forme du premier bloc comprenant ce "mot")

    Voici mon XSL

    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
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0"  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
        <xsl:output method="xml" encoding="UTF-8" indent="yes"/>
     
        <xsl:key name="mot" match="word" use="@value" />
     
        <xsl:template match="/">
        <file>
            <xsl:for-each select="//word[generate-id() = generate-id(key('mot',@value)[1])]">
                <xsl:element name="word">
                    <xsl:value-of select="@value"/>
                        <xsl:element name="racine">
                            <xsl:value-of select="racine/@value"/>
                                <xsl:element name="forme">
                                    <xsl:value-of select="racine/forme/@value"/>
                                </xsl:element>
                        </xsl:element>
                </xsl:element>
            </xsl:for-each>
        </file>
        </xsl:template>
     
    </xsl:stylesheet>
    D'avance merci




    #EDIT
    Je suis tombé par hasard sur un autre sujet , qui m'a montré une meilleur façon de formulé mon problème et un début de solution sur la FAQ

    Pour l'instant j'obtient la liste des mot avec ses racine mais la racine forme reste dupliqué par chaque racine.
    J'ai du modifié l'architecture de mon XML en entré pour que cela fonctionne mais ce n'est pas un problème.

    Il me reste à réitéré cette réunion pour avoir l'architecture la plus parfaite
    Nouveau résultat

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    <word value="mot1">
     <racine value="racine1">
        <forme value="forme1"/>
     </racine>
      <racine value="racine2">
        <forme value="forme2"/>
      </racine>
     
       <racine value="racine2">
         <forme value="forme3"/>
      </racine>
    </word>
    Nouveau XSL
    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 version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
        <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
        <xsl:key name="regrouper" match="value" use="."/>
        <xsl:template match="/">
            <file>
                <xsl:apply-templates select="file/word/value[generate-id(.)=generate-id(key('regrouper',.)[1])]"/>
            </file>
        </xsl:template>
        <xsl:template match="value">
            <word>
                <xsl:copy-of select="."/>
                <xsl:apply-templates select="//racine[../value=current()]"/>
            </word>
        </xsl:template>
        <xsl:template match="racine">
            <xsl:copy-of select="."/>
        </xsl:template>
    </xsl:stylesheet>

  2. #2
    Membre Expert Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Par défaut
    Je n'ai pas bien compris. Est-ce qu'il y a encore de problème ou qu'il n'y a plus?

  3. #3
    Membre averti
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Octobre 2013
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2013
    Messages : 28
    Par défaut
    Il y en a encore un,je forme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <word value="mot1">
     <racine value="racine1">
        <forme value="forme1"/>
     </racine>
      <racine value="racine2">
        <forme value="forme2"/>
      </racine>
     
       <racine value="racine2">
         <forme value="forme3"/>
      </racine>
    </word>
    et donc il me faut encore rassemblé les forme d'une racine d'un mot pour obtenir

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <word value="mot1">
     <racine value="racine1">
        <forme value="forme1"/>
     </racine>
      <racine value="racine2">
        <forme value="forme2"/>
        <forme value="forme3"/>
      </racine>
    </word>

  4. #4
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Oui mais ton nouveau XSL ne marche pas avec ton XML, alors tu as fait quoi, là, on en est où ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre Expert Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Par défaut
    @cyril_M
    Cela ne m'étonne pas qu'érreurs subsistent. En fait, ce que vous mettez dans la version éditée semble une régression - pire plutôt que mieux - de la version originale.

    En tout cas, ce n'est pas si évident pour un insoupçonné. Je peux vous montrer comment faire et vous verrez que si il n'est pas montré concrètement, ce n'est pas évident qu'on puisse arriver là par tâtonnements (par "trial and error"). J'espère vous en tirer des leçons vous-même de par l'exemple: ce n'est pas mon intention de faire vos travaux à votre place pour faire ça.

    Supposons que le fragment des "words" soit dedans une balise "word-list". Voici le xslt pourrait paraître.
    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
    <!-- etc etc -->
    <xsl:key name="wordvalue" match="word" use="@value" />
    <xsl:key name="racinevalue" match="racine" use="concat(@value,parent::word/@value)" />
     
    <xsl:template match="word-list">
        <xsl:copy>
            <xsl:for-each select="word[generate-id()=generate-id(key('wordvalue', @value)[1])]">
                <xsl:variable name="wv" select="@value" />
                <xsl:copy>
                    <xsl:copy-of select="@value" />
                    <xsl:for-each select="key('wordvalue', $wv)">
                        <xsl:for-each select="racine[generate-id()=generate-id(key('racinevalue',concat(@value,$wv))[1])]">
                            <xsl:call-template name="proc">
                                <xsl:with-param name="wv" select="$wv" />
                                <xsl:with-param name="rv" select="@value" />
                            </xsl:call-template>
                        </xsl:for-each>
                    </xsl:for-each>
                </xsl:copy>
            </xsl:for-each>
        </xsl:copy>
    </xsl:template>
     
    <xsl:template name="proc">
        <xsl:param name="wv" />
        <xsl:param name="rv" />
        <xsl:copy>
            <xsl:copy-of select="@value" />
            <xsl:for-each select="key('racinevalue',concat($rv,$wv))">
                <xsl:for-each select="forme">
                    <xsl:copy-of select="." />
                </xsl:for-each>
            </xsl:for-each>
        </xsl:copy>
    </xsl:template>
    Voilà!

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 25/01/2012, 17h57
  2. [c#] utiliser deux méthodes différentes ayant le même nom!
    Par Cédric B. dans le forum Services Web
    Réponses: 6
    Dernier message: 28/04/2011, 08h51
  3. Réponses: 6
    Dernier message: 07/01/2011, 17h49
  4. Table avec lignes ayant une relation "père-fils"
    Par the java lover dans le forum Windows Forms
    Réponses: 7
    Dernier message: 02/04/2007, 11h20
  5. Problème d’héritage. (si deux fils ont le même père !)
    Par jarod_ab dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 04/03/2006, 13h42

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