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 :

groupe au sein d'un groupe


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    108
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 108
    Points : 62
    Points
    62
    Par défaut groupe au sein d'un groupe
    Bonjour,

    Je n'arrive pas à trouver la solution, pour effectuer un regroupement d'un noeud sans qu'il soit cité à chaque tri au sein d'un groupe. La réponse est certainement basique mais c'est ma premiére manipe dans ce langage

    Mon fichier xml

    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
    <?xml version="1.0" encoding="UTF-8"?>
    <?xml-stylesheet href="transform-3_par_massif.xsl" type="text/xsl"  ?>
    <MASSIF>
      <Voies>
        <Id>0</Id>
        <Cotation>6b</Cotation>
        <Massif>Mont Blanc</Massif>
        <NomDeVoie>La directe</NomDeVoie>
        <Situation>test ..........</Situation>
      </Voies>
      <Voies>
        <Id>1</Id>
        <Cotation>7a</Cotation>
        <Massif>Mont Blanc</Massif>
        <NomDeVoie>La diagonale</NomDeVoie>
        <Situation>plus bas...</Situation>
      </Voies>
      <Voies>
        <Id>2</Id>
        <Cotation>7a+</Cotation>
        <Massif>Mont Blanc</Massif>
        <NomDeVoie>Mister speed</NomDeVoie>
        <Situation>Face Est</Situation>
      </Voies>
      <Voies>
        <Id>3</Id>
        <Cotation>6c</Cotation>
        <Massif>Mont Blanc</Massif>
        <NomDeVoie>La voie normale</NomDeVoie>
        <Situation>Face Ouest</Situation>
      </Voies>
        <Voies>
        <Id>4</Id>
        <Cotation>6b</Cotation>
        <Massif>Mont Blanc</Massif>
        <NomDeVoie>La Lachenale</NomDeVoie>
        <Situation>Face Sud</Situation>
      </Voies> 
      </MASSIF>
    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
    <?xml version="1.0" ?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html" indent="yes" />
     
    <!-- recherche des cotations par Massif pour chaque cotation -->
     
    <xsl:key name="byMassif" match="Voies" use="Massif" />
     
    <xsl:template match="MASSIF"> 
       <ul>
     
       <!-- genere un id pour chaque valeur de cotation et mise en forme -->
     
         <xsl:for-each select="bloc[generate-id() = generate-id(key('byMassif', Massif)[1])]" >
            <xsl:sort select="Massif " />
            <div style="background-color:#b0c4de;"> 
                 Massif : <xsl:value-of select="Massif" /> <hr/>
            </div>
                  <div> 
                          <xsl:for-each select="key('byMassif', Massif)" >
     
                          <xsl:sort select="Cotation"/>
     
                             <div style="position:relative; top:-10px;left:50px;"><br/>  
                                  <xsl:value-of select="Cotation" />
                             </div>     
                             <div style="position:relative; top:-10px;left:50px;">
                                   <ul>                               
                                    	<li> <xsl:value-of select="NomDeVoie" /> </li>  
                                    	<li> description: <xsl:value-of select="Situation" /></li><br/>                                
                                   </ul>                                
                             </div>
                          </xsl:for-each> 
                 </div> 
         </xsl:for-each> 
       </ul> 
    </xsl:template>
    </xsl:stylesheet>
    J'obtiens le résulat suivant :

    Mont Blanc

    6b La directe

    6b La Lachenale

    6c La voie normale

    7a La diagonale

    7a+ Mister speed


    Voici le resultat souhaité:

    Mont Blanc

    6b La directe
    6b La Lachenale

    6c La voie normale

    7a La diagonale

    7a+ Mister speed


    Merci pour vos pistes de reflexions

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    En XSLT 1.0 ce n'est pas basique, non.

    Tu as déjà remarqué que faire un simple regroupement n'est pas évident. Faire un regroupement à l'intérieur d'un autre est abominable.

    Pour un simple regroupement, tu as utilisé un <xsl:key>. Pour un double regroupement il t'en faut deux.

    La première sert à regrouper par massif, donc porte sur le massif, très bien.
    La deuxième doit regrouper par cotation, mais à l'intérieur d'un massif donné. Elle doit donc porter à la fois sur le massif et sur la cotation.

    Quelque chose comme <xsl:key name="cote" match="Voies" use="concat(Massif, '/', Cotation)" />.
    Là je mets un / mais tu peux utiliser autre chose si tu as peur que les massifs ou cotations peuvent contenir un /
    Ensuite ça s'utilise pareil, en faisant à nouveau le concat() correspondant pour sélectionner les couples massif/cotation uniques.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    108
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 108
    Points : 62
    Points
    62
    Par défaut
    Bonjour ,

    Je suis parti sur la base de XSLT 1.0 a vu des exemple de grouping trouvés sur le net.
    Si XLST 2.0 est plus commode je suis prêt à l'adopter je n'ai pas de contrainte particulière.

    Cependant, j'ai beaucoup de difficulté à intégrer le positionnement des balises pour que
    la moulinette fonctionne ......

    Serait-ce abuser de te demander de me préciser où placer le bout de code que tu suggéres?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:key name="cote" match="Voies" use="concat(Massif, '/', Cotation)" />
    Merci.

  4. #4
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Citation Envoyé par christian.bleau Voir le message
    Si XLST 2.0 est plus commode je suis prêt à l'adopter je n'ai pas de contrainte particulière.
    Carrément, lui il a <xsl:for-each-group> qui est fait pour ça.

    Citation Envoyé par christian.bleau Voir le message
    Serait-ce abuser de te demander de me préciser où placer le bout de code que tu suggéres?
    À côté de l'autre <xsl:key>. Peu importe où précisément, ce n'est qu'une déclaration, l'essentiel c'est qu'elle existe.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    108
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 108
    Points : 62
    Points
    62
    Par défaut
    Je ne capte rien à la logique de ce langage, je n'y arrive pas.
    Je suis une tanche mais c'est pas grave.

    Effectivement en 2.0 j'avais repéré le
    <xsl:for-each-group>
    Je me contenterai de ces redondances.

    Merci bien.

  6. #6
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Tout de même, avec for-each-group, c'est pas compliqué de faire des for imbriqués. Ça existe dans tous les langages, ça.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    108
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 108
    Points : 62
    Points
    62
    Par défaut
    Je vais peut être sortir du topic de l'intitulé Si cela gène, je poste sous un autre intitulé.

    Sur la base du code xsl ci dessous pour le même fichier xml que ci dessus je veux récupérer un variable "tag" xml pour la stocker dans un javascript pour en faire usage dans une autre routine que je lance via un hyperlink
    et ceci pour chaque boucle.

    En phase d'essai Je teste la valeur à l'aide d'une alerte.
    Je ne sais comment lancer la fonction dans le cadre d'un fichier xsl
    Bien évidement, je ne récupère que la variable de la dernière itération.

    Quelle solution devrais-je adopter?

    Merci bien.

    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
    <?xml version="1.0" ?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html" indent="yes" />
     
    <!-- recherche des cotations par Massif pour chaque cotation -->
     
    <xsl:key name="byMassif" match="Voies" use="Massif" />
     
    <xsl:template match="MASSIF"> 
       <ul>
     
       <!-- genere un id pour chaque valeur de cotation et mise en forme -->
     
         <xsl:for-each select="Voies[generate-id() = generate-id(key('byMassif', Massif)[1])]" >
                 <xsl:sort select="Massif " />
            <div style="background-color:#b0c4de;"> 
                 Massif : <xsl:value-of select="Massif" /> <hr/>
            </div>
                  <div> 
                          <xsl:for-each select="key('byMassif', Massif)" >
     
                          <xsl:sort select="Cotation"/>
     
                             <div style="position:relative; top:-10px;left:50px;"><br/>  
                                  <xsl:value-of select="Cotation" />
                             </div>     
                             <div style="position:relative; top:-10px;left:50px;">
                                   <ul>                               
                                    	<li> Nom:<xsl:value-of select="NomDeVoie" /> </li>  
                                    	<li> description: <xsl:value-of select="Situation" /></li>
                                    	<li> Id :  <xsl:value-of select="Id" /></li>  
                                    	<li> Lien: <a><xsl:attribute name="HREF">http://81.56.55.95:8080/7ableau/images/<xsl:value-of select="NomJpeg"/></xsl:attribute>Lien</a></li>
                                    	<li> img: <img height="80px"><xsl:attribute name="src">http://81.56.55.95:8080/7ableau/images/<xsl:value-of select='NomJpeg' /></xsl:attribute></img></li>             
                                    	<li><script type="text/javascript">
    							function AlertIt() {
    							var alert = '<xsl:value-of select="Situation" />'
    							var answer = confirm (alert)
    							<!--if (answer)
    							window.location="http://pofableau.com";-->
    										}
    					</script>
    					<a href="javascript:AlertIt();">verifier variable</a>
    					</li>            
                                   </ul>                                
                             </div>
                         </xsl:for-each> 
                 </div> 
         </xsl:for-each> 
       </ul> 
    </xsl:template>
    </xsl:stylesheet>

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    108
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 108
    Points : 62
    Points
    62
    Par défaut
    essayant de cerner les infos je teste en incluant des petits scripts type:

    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <script type="text/javascript">
    xmlDoc=loadXMLDoc("tri.xml");
    x=xmlDoc.getElementsByTagName("Voies")[0].childNodes[0];
    document.write(x.data);
    document.write(" Nb de noeud: ");
    document.write(x.length);
    </script>

    mais je n'arrive pas à écrire la condition qui permettrait de stocker la variable "Id" par exemple.
    et si j'essaie d'implanter une boucle avec comme valeur x = x.length je me fais jeter pour une erreur de parsing.

    merci du coup de pouce je suis vraiment planté.

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    108
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 108
    Points : 62
    Points
    62
    Par défaut
    Si cela peut être utile, j'ai identifié que pour passer la valeur d'une ou plusieurs variables d'une page à une autre, la méthode la plus simple consiste à passer la dans l'URL de la page demandée, soit trois lignes de javascript interprétables par le quidam sans avoir bac+ 7.

    exemple dans le cadre d'un xsl

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <li> Lien id: <a><xsl:attribute name="HREF">http://monsite.com/index.html?<xsl:value-of select="ma variable" /></xsl:attribute>Lien</a></li>
    ne pas oublié le point d'interrogation .
    La variable est alors disponible dans la page appelée par:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    var requete = location.search.substring(1); 
    mavariable=requete;

Discussions similaires

  1. Réponses: 11
    Dernier message: 29/05/2015, 12h19
  2. Compte au sein d'un groupe
    Par Angie1500 dans le forum SAS Base
    Réponses: 12
    Dernier message: 01/06/2012, 15h19
  3. Tri au sein d'un groupe
    Par LuckyLuke56 dans le forum FastReport
    Réponses: 5
    Dernier message: 13/10/2009, 08h25
  4. Réponses: 3
    Dernier message: 16/08/2006, 16h05
  5. traiter les groupes retourné par la requête GROUP BY
    Par mgemc2 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 16/08/2006, 13h16

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