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] Regroupement d'attribut


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 9
    Points : 1
    Points
    1
    Par défaut [XSLT] Regroupement d'attribut
    Bonjour,

    Je suis nouveau sur le forum, j'aimerai vous soumettre un problème sur lequel je penche depuis 2 heures. N'étant pas spécialiste dans le domaine je fais appel à vos compétences !

    J'aimerai regrouper plusieurs elements et attributs ensemble comme ceux-ci:

    Le fichier de départ:

    <spawn map="210050000" npcid="400325" pool="1" interval="295">
    <object x="608.28186" y="1676.9269" z="340.22418" h="0"/>
    </spawn>
    <spawn map="210050000" npcid="400325" pool="1" interval="295">
    <object x="1682.6425" y="1849.335" z="263.45734" h="0"/>
    </spawn>
    <spawn map="210050000" npcid="400325" pool="1" interval="295">
    <object x="889.46539" y="1820.2402" z="335.85309" h="0"/>
    </spawn>

    <spawn map="210050000" npcid="400213" pool="1" interval="295">
    <object x="151.64667" y="427.91653" z="592.3017" h="0"/>
    </spawn>
    <spawn map="210050000" npcid="400213" pool="1" interval="295">
    <object x="111.29594" y="1331.0725" z="376.35284" h="0"/>
    </spawn>
    <spawn map="210050000" npcid="400213" pool="1" interval="295">
    <object x="325.23514" y="503.58997" z="579.47473" h="0"/>
    </spawn>
    En ceux-ci:

    <spawn map="210050000" npcid="400325" pool="3 interval="295">
    <object x="608.28186" y="1676.9269" z="340.22418" h="0"/>
    <object x="1682.6425" y="1849.335" z="263.45734" h="0"/>
    <object x="889.46539" y="1820.2402" z="335.85309" h="0"/>
    </spawn>

    <spawn map="210050000" npcid="400213" pool="3" interval="295">
    <object x="151.64667" y="427.91653" z="592.3017" h="0"/>
    <object x="111.29594" y="1331.0725" z="376.35284" h="0"/>
    <object x="325.23514" y="503.58997" z="579.47473" h="0"/>
    </spawn>
    Si un spécialiste passe par là et qu'il veut bien m'aider, je lui en serai très reconnaissant.

    Cordialement,

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 559
    Points : 21 621
    Points
    21 621
    Par défaut
    C'est une méthode Muench qu'il te faut. Le problème étant que là, la clé est composée de trois attributs, ce qui la rend un peu complexe.

    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <xsl:key name="groupe" match="spawn"
      use="concat(@map, '/', @npcid, '/', @interval)"/>
     
    <xsl:template match="/">
      <root>
        <!-- Tous les spawn de triplet @map, @npcid, @interval distincts : -->
        <xsl:apply-templates
          select="//spawn[generate-id(.) = generate-id(key('groupe', concat(@map, '/', @npcid, '/', @interval)))]"
          />
      </root>
    </xsl:template>
    Ensuite, dans le template ainsi appelé, plus qu'à sélectionner tous les <object> enfants d'un <spawn> qui a les mêmes attributs, et de les insérer tous comme enfants d'un seul spawn.

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    Je suis entrain de chercher mais cela n'a pas l'air facile.
    En tout cas je vous remercie pour l'aide proposée !
    PS: J'avais deja vu cette méthode dans le tutos mais il me renvoie tout le temps <spawn> et rien d'autre.

  4. #4
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    <spawns>
    <spawn map="210050000" npcid="400325" pool="1" interval="295">
    <object x="608.28186" y="1676.9269" z="340.22418" h="0"/>
    </spawn>
    <spawn map="210050000" npcid="400325" pool="1" interval="295">
    <object x="1682.6425" y="1849.335" z="263.45734" h="0"/>
    </spawn>
    <spawn map="210050000" npcid="400325" pool="1" interval="295">
    <object x="889.46539" y="1820.2402" z="335.85309" h="0"/>
    </spawn>

    <spawn map="210050000" npcid="400213" pool="1" interval="295">
    <object x="151.64667" y="427.91653" z="592.3017" h="0"/>
    </spawn>
    <spawn map="210050000" npcid="400213" pool="1" interval="295">
    <object x="111.29594" y="1331.0725" z="376.35284" h="0"/>
    </spawn>
    <spawn map="210050000" npcid="400213" pool="1" interval="295">
    <object x="325.23514" y="503.58997" z="579.47473" h="0"/>
    </spawn>
    </spawns>
    Voila après modification:

    <?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="spawns" match="spawn"
    use="concat(@map, '/', @npcid, '/', @pool, '/', @interval)"/>

    <xsl:template match="/">
    <spawns>
    <!-- Tous les spawn de triplet @map, @npcid, @interval distincts : -->
    <xsl:apply-templates
    select="//spawn[generate-id(.) = generate-id(key('spawns', concat(@map, '/', @npcid, '/', @pool, '/', @interval)))]"
    />
    </spawns>
    </xsl:template>
    </xsl:stylesheet>
    Malheureusement cela me retourne:

    <?xml version="1.0" encoding="UTF-8"?>
    <spawns/>
    Si quelqu'un aurait une idée ^^

  5. #5
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 559
    Points : 21 621
    Points
    21 621
    Par défaut
    Ah, attention. Moi je réponds à ta question sur le regroupement, mais je fais pas tes devoirs.
    Si tu veux connaître le XSLT, apprends.
    Je t'ai donné un lien vers la méthode Muench, je t'ai montré comment définir la clé qui n'est pas évidente. Le reste je suppose que tu peux le déduire seul.

    Dans le code ci-dessus, il faut bien sûr ajouter le <template match="spawn"> et indiquer dedans ce qu'on fait de ces spawn sélectionnés.

    Le principe étant d'insérer un <spawn> avec les mêmes attributs, de compter et sélectionner les <objet> à mettre dedans, et de les mettre dedans.

  6. #6
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    Pas de problème
    Je vais continuer de chercher parce que 8000 lignes à la main ça va être dur !

  7. #7
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 559
    Points : 21 621
    Points
    21 621
    Par défaut
    Commence par des tutoriels simples avec des <xsl:template> et des <xsl:for-each>.

    Il faut juste ajouter un template sur spawn, dans lequel on insère un <spawn>, et on select tous les objets supposés être dedans, puis on les met dedans.

  8. #8
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    Je suis casual dans ce domaine, je vais chercher mais rien de concluant pour le moment.
    Merci de l'aide apportée dans tout les cas.

  9. #9
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    Bon ça fait quelques jours que je cherche mais n'étant pas expert dans le domaine il me donne la première valeur sans grouper les autres éléments.
    Si une personne a une idée je suis preneur merci.

    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0" xmlnssl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    <xsl:key name="spawns" match="spawn"
    use="concat(@map, '/', @npcid, '/', @pool, '/', @interval)"/>

    <xsl:template match="/">
    <spawns>
    <!-- Tous les spawn de triplet @map, @npcid, @interval distincts : -->
    <xsl:apply-templates
    select="//spawn[generate-id(.) = generate-id(key('spawns', concat(@map, '/', @npcid, '/', @pool, '/', @interval)))]"
    />
    </spawns>
    </xsl:template>
    <xsl:template match="spawn">
    <xsl:copy-of select="."/>
    <xsl:apply-templates select="//object[../spawn=current()]"/>
    </xsl:template>
    </xsl:stylesheet>

  10. #10
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 559
    Points : 21 621
    Points
    21 621
    Par défaut
    - Je comprends pas pourquoi tu mets pool dans la clé. Je croyais que pool était le nombre d'<object> contenus. C'est pas le cas ?

    - N'utilise pas copy-of comme ça, ça fait pas ce que tu veux.

    Le plus simple, je pense, est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <xsl:variable name="objects"
      select="//object[../@map = current()/@map and ../@npcid = current()/@npcid and ../@interval = current()/@interval]"
      />
     
    <spawn map="{@map}" npcid="{@npcid}" interval="{@interval}"
      pool="{count($objects)}"
      >
     
      <xsl:copy-of select="$objects"/>
     
    </spawn>
    Une fois qu'on a isolé les éléments <spawn> à retenir, pour chacun d'eux on sélectionne les <object> à mettre dedans, on compte combien il y en a pour le mettre dans l'attribut pool, et on les copie comme enfants du <spawn>.

  11. #11
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    J'ai regardé les exemples ici: http://www.developpez.net/forums/d65...tion-attribut/
    et ici http://xml.developpez.com/faq/?page=3#xslt_doublon

    <?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="spawn" match="spawn"
    use="concat(@map, '/', @npcid, '/', @interval)"/>

    <xsl:template match="/">
    <spawns>
    <!-- Tous les spawn de triplet @map, @npcid, @interval distincts : -->
    <xsl:apply-templates
    select="//spawn[generate-id(.) = generate-id(key('spawn', concat(@map, '/', @npcid, '/', @interval)))]"
    />
    </spawns>

    <xsl:variable name="spawn">
    <xsl:copy-of select="."/>
    <xsl:apply-templates select="//object[../spawn=current()]"/>
    </xsl:variable>


    <xsl:variable name="objects"
    select="//object[../@map = current()/@map and ../@npcid = current()/@npcid and ../@interval = current()/@interval]"
    />

    <spawn map="{@map}" npcid="{@npcid}" interval="{@interval}"
    pool="{count($objects)}"
    >

    <xsl:copy-of select="$objects"/>

    </spawn>
    </xsl:template>
    </xsl:stylesheet>
    Ce n'est pas de la bonne foi qui manque mais quand on ne sait pas on ne sait pas :(

  12. #12
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 559
    Points : 21 621
    Points
    21 621
    Par défaut
    Ce n'est pas de la bonne foi qui manque mais quand on ne sait pas on ne sait pas
    Oui d'accord, mais... Tu fais pas du tout les tutoriels ?
    xsl:template, tu vois pas du tout ce que c'est, en fait ?

    Il faut un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:template match="/">
    Pour créer l'élément <spawns> racine et sélectionner les <spawn> à mettre dedans, et un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:template match="spawn">
    Pour indiquer ce qu'on fait de chacun des <spawn> qui ont été sélectionnés par le template de la racine.

  13. #13
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    Je te remercie de me consacrer du temps !
    Je pense que ça doit être chiant parfois de le faire.
    Je vais essayer de comprendre mais comme je l'ai précisé auparavant je suis novice dans le domaine.

  14. #14
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 559
    Points : 21 621
    Points
    21 621
    Par défaut
    Contente-toi d'apprendre avec des tutoriaux... Et quand tu comprends pas pourquoi une chose fait ça ou marche, alors qu'une autre chose fait ci ou ne marche pas, dans ce cas-là n'hésite pas à poser des questions -_-°.

  15. #15
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    Je remercie encore une fois TheElvin pour l'aide apporter!
    J'ai trouvé la solution via un parser.

Discussions similaires

  1. [XSLT] Regrouper les noeuds en fonction d'un attribut
    Par Creuvard dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 11/12/2008, 11h31
  2. [XSLT] Regroupement et tri d'un XML selon un attribut
    Par tatemilio2 dans le forum XSL/XSLT/XPATH
    Réponses: 7
    Dernier message: 25/01/2007, 11h18
  3. [XSLT]Regroupement par attribut.
    Par zserdtfg dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 08/12/2006, 11h35
  4. [XSLT] Affichage selon attribut
    Par Henry23 dans le forum XSL/XSLT/XPATH
    Réponses: 10
    Dernier message: 30/06/2006, 09h49
  5. [XSLT] Dédoublonner des attributs
    Par 242 dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 10/11/2005, 15h44

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