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 :

Regrouper des champs multiples pour qu'ils soient uniques [XSLT 1.0]


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2011
    Messages
    28
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2011
    Messages : 28
    Points : 18
    Points
    18
    Par défaut Regrouper des champs multiples pour qu'ils soient uniques
    Bonjour,

    j'ai un souci XSL, concernant l'unicité de mon traitement. Je m'explique : dans le XML ci-dessous je veux afficher une sorte de tableau avec une seul ligne concernant le hostname1 genre:
    hostname || Job

    <MULTI>
    <INSTANCE name="Client" >
    <ITEM>hostname1</ITEM>
    </INSTANCE>
    <INSTANCE name="Job" >
    <ITEM>/var</ITEM>
    </INSTANCE>
    </MULTI>
    <MULTI>
    <INSTANCE name="Client" >
    <ITEM>hostname1</ITEM>
    <INSTANCE name="Job" >
    <ITEM>/data</ITEM>
    </INSTANCE>
    <MULTI>
    Mon problème c'est que je n'arrive pas à faire en sorte que ça m'affiche qu'une seul ligne en gros je veux regrouper les jobs pour les memes hosts.
    J'ai regardé ici : http://xml.developpez.com/faq/?page=3#xslt_doublon
    Mais je n'arrive pas l'utiliser dans mon cas

    avez vous une solution

    merci

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 565
    Points : 21 630
    Points
    21 630
    Par défaut
    Tu veux produire quoi, à quelles conditions ?

    Non, ton premier post ne le dit pas. Et si tu n'arrives pas à appliquer l'article de FAQ mentionné, c'est que ce que tu essaies de faire n'est pas directement évident.

  3. #3
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2011
    Messages
    28
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2011
    Messages : 28
    Points : 18
    Points
    18
    Par défaut rep
    je veux obtenir une ligne du type :
    hostname1 || /data /var

    je ne veux pas :

    hostname1 || /data
    hostname1 || /var

    je veux donc éviter les doublons et regrouper /data et /var dans la meme ligne!
    Est ce plus clair?

  4. #4
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 565
    Points : 21 630
    Points
    21 630
    Par défaut
    Beaucoup plus clair, je ne vois pas ce que cette histoire de hostname1 || Job faisait dans le premier post.
    Au passage, il y a un problème avec ta deuxième balise <INSTANCE name="Client" > : elle s'ouvre mais ne se ferme pas. On va dire que c'est un oubli.

    Bon, la clé porte sur les INSTANCE[@name='Client']
    Le use sera ITEM.

    Tu sélectionnes toutes les valeurs uniques de ITEM pour les INSTANCE en question, comme le montre la FAQ.
    À l'intérieur de cette boucle, tu veux boucler pour choper /var et /data. Voici comment :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <xsl:variable name="$hostname" select="ITEM"/>
     
    <xsl:for-each select="/MULTI/INSTANCE[@name='Job'][preceding-sibling::INSTANCE[ITEM = $hostname]]/ITEM">
      <!-- faire quelque chose avec -->
    </xsl:for-each>
    Edit : euh, il y a plus simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <xsl:variable name="$hostname" select="ITEM"/>
     
    <xsl:for-each select="/MULTI/INSTANCE[@name='Client' and ITEM = $hostname]/following-sibling::INSTANCE/ITEM">
      <!-- faire quelque chose avec -->
    </xsl:for-each>

  5. #5
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2011
    Messages
    28
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2011
    Messages : 28
    Points : 18
    Points
    18
    Par défaut RE modélisation
    Merci de ton aide mais enfait ce n'est pas vraiment le modèle xml que j'ai je me suis mal exprimé selon la répétition des noeud.

    J'ai un fichier composé comme cela :

    <?xml version="1.0" encoding="UTF-8"?>
    <REPORT>
    <MULTI>
    <INSTANCE name="Client">
    <ITEM>hostname1</ITEM>
    </INSTANCE>
    <INSTANCE name="Status" >
    <ITEM>failed</ITEM>
    </INSTANCE>
    </MULTI>
    <MULTI>
    <INSTANCE name="Client">
    <ITEM>hostname2</ITEM>
    </INSTANCE>
    <INSTANCE name="Status" >
    <ITEM>success</ITEM>
    </INSTANCE>
    </MULTI>
    <MULTI>
    <INSTANCE name="Client">
    <ITEM>hostname1</ITEM>
    </INSTANCE>
    <INSTANCE name="Status" >
    <ITEM>success</ITEM>
    </INSTANCE>
    </MULTI>
    </REPORT>
    Je veux dans ce cas encore une fois, trier les hostname afin d'obtenir le résultat :

    hostname1 failed
    hostname2 success

    Je veux faire aparaitre mon failed à condition que j'ne obtiens au moins un

    merci et désolé encore pour cette erreur copier coller !!!

  6. #6
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2011
    Messages
    28
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2011
    Messages : 28
    Points : 18
    Points
    18
    Par défaut
    Personne peut m'aider? C'est vraiement un problème sur lequel je but depuis un moment!!
    merci

  7. #7
    Expert confirmé
    Avatar de Loceka
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    2 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 2 276
    Points : 4 843
    Points
    4 843
    Par défaut
    En utilisant Muench c'est faisable. Par contre pense à mettre les balises code (bouton #) quand tu mets du... code, c'est plus lisible.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <xsl:stylesheet id="stylesheet" version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    	<xsl:key name="client_status" match="/REPORT/MULTI" use="concat(INSTANCE[@name='Client']/ITEM, '_', INSTANCE[@name='Status']/ITEM)"/>
     
    	<xsl:template match="/">
    		<xsl:for-each select="REPORT/MULTI[generate-id() = generate-id(key('client_status', concat(INSTANCE[@name='Client']/ITEM, '_', INSTANCE[@name='Status']/ITEM))[1])]">
    			<xsl:sort select="INSTANCE[@name='Client']/ITEM"/>
    			<xsl:value-of select="INSTANCE[@name='Client']/ITEM"/> : <xsl:value-of select="INSTANCE[@name='Status']/ITEM"/>
    		</xsl:for-each>
    	</xsl:template>
    </xsl:stylesheet>

  8. #8
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 565
    Points : 21 630
    Points
    21 630
    Par défaut
    À mon avis il y a plus simple, mais je ne comprends pas quel est le résultat désiré, en quelles conditions.

    C'est juste la deuxième fois que je fais cette remarque dans ce fil...

  9. #9
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2011
    Messages
    28
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2011
    Messages : 28
    Points : 18
    Points
    18
    Par défaut résolu
    merci beaucoup loceka pour ta réponse pertinente.

    Juste une précision le '_' permet de faire en sorte que mes 2 champs soient une clé unique si j'ai bien compris!

  10. #10
    Expert confirmé
    Avatar de Loceka
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    2 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 2 276
    Points : 4 843
    Points
    4 843
    Par défaut
    Oui, en quelque sorte.

    ça permet surtout, dans le cas de concaténation numérique, de ne pas avoir d'effet de bord. En effet si tu veux concaténer champ1 et champ2, sans un caractère de séparation tu pourrais avoir ça :
    champ1 = "test1"; champ2 = "2" => "test12"
    champ1 = "test"; champ2 = "12" => "test12"

    donc deux entrées distinctes seraient traitées comme une même entrée.

    Après tu mets ce que tu veux comme caractère de séparation, tout ce qu'il faut c'est que ce caractère ne se retrouve pas dans les deux champs que tu concatènes (s'il peut se trouver dans un champ mais pas dans l'autre alors ça passe).

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

Discussions similaires

  1. tMap: utilisation du tMap pour une regroupement des champs
    Par ben.83 dans le forum Développement de jobs
    Réponses: 2
    Dernier message: 18/03/2010, 08h51
  2. formulaire avec des champs multiples
    Par don'de dans le forum Struts 1
    Réponses: 13
    Dernier message: 16/02/2007, 09h42
  3. Réponses: 2
    Dernier message: 23/08/2006, 17h26
  4. Regrouper des champs par mois
    Par nou366 dans le forum Bases de données
    Réponses: 4
    Dernier message: 17/05/2006, 14h23
  5. Regrouper des champs dans un GROUP BY
    Par kaiserazo dans le forum Langage SQL
    Réponses: 7
    Dernier message: 11/07/2005, 08h43

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