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 :

Générer des index en regroupant par valeurs d'attributs [XSLT 1.0]


Sujet :

XSL/XSLT/XPATH XML

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

    Informations forums :
    Inscription : Novembre 2009
    Messages : 7
    Points : 10
    Points
    10
    Par défaut Générer des index en regroupant par valeurs d'attributs
    Bonjour à tous,
    J'ai un petit problème que je n'arrive pas à résoudre, même en passant par la FAQ XML et le site ZVON.
    Je voudrais, à partir d'un fichier XML, récupérer le texte encodé avec les éléments
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <index indexName="Lieux">
                      <term sortKey=""></term>
                   </index>
    et les trier dans un autre fichier XML en fonction la valeur de @sortKey afin de générer un index dans lequel une entrée est créée pour chaque valeur identique de @sortKey, puis d'y intégrer en tant qu'enfants chaque occurence du lieu recensé.

    J'ai réussi à trier les éléments avec <xsl:key> mais le problème est que j'ai des doublons que je voudrais supprimer.

    Extrait du code XML source:
    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    <div type="copie" xml:id="copy1">
                <p>
                    <index indexName="Lieux">
                      <term sortKey="Landrecy">landrecy</term>
                    </index>
                    <index indexName="Lieux">
                      <term sortKey="Nice">Nice</term>
                   </index>
                </p>
             </div>
           <div type="copie" xml:id="copy3">
                <p>
                <index indexName="Lieux">
                      <term sortKey="Cancaus">cancaus</term>
                </index>
                </p>
             </div>
             <div type="copie" xml:id="copy4">
               <p>
                   <index indexName="Lieux">
                      <term sortKey="Landrecy">landrecy</term>
                   </index>
                   <index indexName="Lieux">
                      <term sortKey="Laon">laon</term>
                   </index>
                   <index indexName="Lieux">
                      <term sortKey="Rome">Rome</term>
                   </index>
               </p>
             </div>
             <div type="copie" xml:id="copy5">
                <p>
                    <index indexName="Lieux">
                      <term sortKey="inconnu">abaye</term>
                </index>
                </p>
             </div>
             <div type="copie" xml:id="copy7">
               <p>
                    <index indexName="Lieux">
                      <term sortKey="Lyon">lion</term>
                    </index>
                    <index indexName="Lieux">
                      <term sortKey="abbaye_de_St_Pierre">St Pierre</term>
                    </index>
                </p>
             </div>
             <div type="copie" xml:id="copy8">
               <p>
                    <index indexName="Lieux">
                      <term sortKey="Lyon">lion</term>
                   </index>
                </p>
             </div>
             <div type="copie" xml:id="copy10">
                <p><index indexName="Lieux">
                      <term sortKey="Paris">Paris</term>
                </index>
                    <index indexName="Lieux">
                      <term sortKey="inconnu">abaie</term>
                    </index>
                </p>
             </div>
    XSLT
    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
    37
     
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet 
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
      xmlns:tei="http://www.tei-c.org/ns/1.0"
      version="1.0">
    <xsl:output method="xml" indent="yes" encoding="UTF-8"/>
      <xsl:key name="lieuxId" match="tei:term[parent::tei:index[@indexName='Lieux']]" use="@sortKey"/>
    <xsl:template match="/">
     
    <TEI>
        <text>
        <body>
          <div>
            <p>
              <xsl:for-each select="descendant::tei:index[@indexName='Lieux']">
                    <index indexName="{tei:term/@sortKey}">
                      <xsl:apply-templates select="key('lieuxId',tei:term/@sortKey)"/>
     
                    </index>
                </xsl:for-each>
             </p>
          </div>
        </body>
        </text>
    </TEI>
    </xsl:template>
     
      <xsl:template match="tei:index[@indexName='Lieux']/tei:term">
        <term>
          <xsl:attribute name="corresp">
            <xsl:value-of select="concat('#',ancestor::tei:text/@xml:id,ancestor::tei:div/@xml:id)"/>
          </xsl:attribute>
          <xsl:value-of select="."/>
        </term>
      </xsl:template>
    </xsl:stylesheet>
    Code XML généré
    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    <?xml version="1.0" encoding="UTF-8"?>
    <TEI xmlns:tei="http://www.tei-c.org/ns/1.0">
       <text>
          <body>
             <div>
                <p>
                   <index indexName="Landrecy">
                      <term corresp="#BMLyonMs1486copy1">landrecy</term>
                      <term corresp="#BMLyonMs1486copy4">landrecy</term>
                   </index>
                   <index indexName="Nice">
                      <term corresp="#BMLyonMs1486copy1">Nice</term>
                   </index>
                   <index indexName="Cancaus">
                      <term corresp="#BMLyonMs1486copy3">cancaus</term>
                   </index>
                   <index indexName="Landrecy">
                      <term corresp="#BMLyonMs1486copy1">landrecy</term>
                      <term corresp="#BMLyonMs1486copy4">landrecy</term>
                   </index>
                   <index indexName="Laon">
                      <term corresp="#BMLyonMs1486copy4">laon</term>
                   </index>
                   <index indexName="Rome">
                      <term corresp="#BMLyonMs1486copy4">Rome</term>
                   </index>
                   <index indexName="inconnu">
                      <term corresp="#BMLyonMs1486copy5">abaye</term>
                      <term corresp="#BMLyonMs1486copy10">abaie</term>
                   </index>
                   <index indexName="Lyon">
                      <term corresp="#BMLyonMs1486copy7">lion</term>
                      <term corresp="#BMLyonMs1486copy8">lion</term>
                   </index>
                   <index indexName="abbaye_de_St_Pierre">
                      <term corresp="#BMLyonMs1486copy7">St Pierre</term>
                   </index>
                   <index indexName="Lyon">
                      <term corresp="#BMLyonMs1486copy7">lion</term>
                      <term corresp="#BMLyonMs1486copy8">lion</term>
                   </index>
                   <index indexName="Paris">
                      <term corresp="#BMLyonMs1486copy10">Paris</term>
                   </index>
                   <index indexName="inconnu">
                      <term corresp="#BMLyonMs1486copy5">abaye</term>
                      <term corresp="#BMLyonMs1486copy10">abaie</term>
                   </index>
                </p>
             </div>
          </body>
       </text>
    </TEI>
    Comme vous le voyez, j'ai des doublons dont j'aimerais me débarrasser. J'ai essayé avec generate-id(), mais cela n'a rien donné. Ou alors, j'ai fait une erreur toute bête, étant donnée que je suis débutante.

    Merci bien de votre aide
    Lydie

  2. #2
    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 : 48
    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
    voir la méthode muench

    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
    37
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet 
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
      xmlns:tei="http://www.tei-c.org/ns/1.0"
      version="1.0">
    <xsl:output method="xml" indent="yes" encoding="UTF-8"/>
     <xsl:key name="lieuxcle" match="tei:index[@indexName='Lieux']" use="tei:term/@sortKey"/>
      <xsl:key name="lieuxId" match="tei:term[parent::tei:index[@indexName='Lieux']]" use="@sortKey"/>
    <xsl:template match="/">
     
    <TEI>
        <text>
        <body>
          <div>
            <p>
              <xsl:for-each select="(//tei:index[@indexName='Lieux'])[generate-id(.)=generate-id(key('lieuxcle',tei:term/@sortKey)[1])]">
                    <index indexName="{tei:term/@sortKey}">
                      <xsl:apply-templates select="key('lieuxId',tei:term/@sortKey)"/>
     
                    </index>
                </xsl:for-each>
             </p>
          </div>
        </body>
        </text>
    </TEI>
    </xsl:template>
     
      <xsl:template match="tei:index[@indexName='Lieux']/tei:term">
        <term>
          <xsl:attribute name="corresp">
            <xsl:value-of select="concat('#',ancestor::tei:text/@xml:id,ancestor::tei:div/@xml:id)"/>
          </xsl:attribute>
          <xsl:value-of select="."/>
        </term>
      </xsl:template>
    </xsl:stylesheet>

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

    Informations forums :
    Inscription : Novembre 2009
    Messages : 7
    Points : 10
    Points
    10
    Par défaut
    Merci bien, c'est exactement ce qu'il me fallait. J'avais vu la méthode Muench sur la FAQ, je savais que ça correspondait exactement à ce que je voulais faire mais je n'avais pas bien compris la syntaxe et je ne trouvais pas d'autres exemples similaires sur ZVON ou ailleurs.
    En tout cas, merci, votre réponse m'aide beaucoup.
    Lydie

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

Discussions similaires

  1. [SimpleXML] Recherche par valeur d'attribut récupération valeur du noeud
    Par Cortexx dans le forum Bibliothèques et frameworks
    Réponses: 3
    Dernier message: 28/02/2015, 14h34
  2. XSLT synthèse regroupée par valeurs
    Par raphael75015 dans le forum XSL/XSLT/XPATH
    Réponses: 28
    Dernier message: 03/10/2013, 10h31
  3. [XSLT 2.0] Regrouper par valeur d'attribut + compteur
    Par karote dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 24/01/2011, 14h15
  4. Regroupement par valeurs
    Par laurentabj dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 28/09/2007, 12h13
  5. Réponses: 5
    Dernier message: 08/09/2006, 12h12

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