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 :

[Noob][XSL] Comment faire ceci ??


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre régulier
    Inscrit en
    Février 2005
    Messages
    147
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 147
    Points : 78
    Points
    78
    Par défaut [Noob][XSL] Comment faire ceci ??
    Bonjour a tous et a toutes,

    voici mon problème je voudrais afficher des liens dans un ordre bien précis (grâce au N° contenu dans col[7]) et trier ceux ci par groupe (grâce au nom de groupe contenu dans col[8]) , afin de rassembler les liens d'un meme groupe entre eux et de les afficher selon un ordre défini par col[7].

    Pour mieux comprendre voici une partie de mon .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
     
    <functions>
    	<header>
    		<col name="FCT_ID"/>
    		<col name="MODULE_ID"/>
    		<col name="FUNCTION"/>
    		<col name="DISPLAY"/>
    		<col name="LINK"/>
    		<col name="HELP_URL"/>
    		<col name="MENU_ORDER"/>
    		<col name="MENU_GROUP"/>
     
    	</header>
    	<row>
    		<col>10</col>
    		<col>1</col>
    		<col>Outsourcer Informations</col>
    		<col>1</col>
    		<col>UOData.html</col>
    		<col></col>
    		<col>9</col>
    		<col>Outsourcer</col>
    	</row>
    Pour ce faire j'ai crée la code suivant :
    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
     
     								<xsl:for-each select="row">
     								 <xsl:sort select="col[7]" data-type="number" order="ascending"/> 
    								 <xsl:sort select="col[8]" data-type="text" order="ascending"/> 
        								   <xsl:if test="col[4] != 0">
        								      <xsl:if test="col[8] != 0">
    									<table border="0" cellpadding="0" cellspacing="0" width="168">
    										<tr>
    	  										<td background="decoTd.gif" height="1" width="3"></td>
    										</tr>
    										<tr>
    	  										<td class="group"><xsl:value-of select="col[8]"/></td>
    										</tr>
    										<tr>
    	  										<td background="decoTd.gif" height="1" width="3"></td>
    										</tr>
    								        </table>
    									<table border="0" cellpadding="0" cellspacing="0" width="168">
    										<tr>
    	  										<td background="decoTd.gif" height="1" width="3"></td>
    										</tr>
    										<tr>
    	  										<td><xsl:text disable-output-escaping="yes"><![CDATA[&nbsp;&nbsp;&nbsp;]]></xsl:text><A href="{col[5]}" target="main"><xsl:value-of select="col[3]"/></A></td>
    										</tr>
    										<tr>
    	  										<td background="decoTd.gif" height="1" width="3"></td>
    										</tr>
    								        </table>								          								      
        								      </xsl:if>
        								      <xsl:if test="col[8] = 0">
    									<table border="0" cellpadding="0" cellspacing="0" width="168">
    										<tr>
    	  										<td background="decoTd.gif" height="1" width="3"></td>
    										</tr>
    										<tr>
    	  										<td><A href="{col[5]}" target="main"><xsl:value-of select="col[3]"/></A></td>
    										</tr>
    										<tr>
    	  										<td background="decoTd.gif" height="1" width="3"></td>
    										</tr>
    								      </table>
    								   </xsl:if>
    								 </xsl:if>
    								</xsl:for-each>
    Et j'obtien en sortie ceci :
    groupe1
    NomLien1 du Groupe1
    groupe1
    NomLien2 du Groupe1
    groupe1
    NomLien3 du Groupe1
    groupe2
    NomLien1 du Groupe2
    groupe2
    NomLien2 du Groupe2
    ...
    groupeN
    NomLien1 du GroupeN
    Et je voudrais obtenir ceci :
    groupe1
    NomLien1 du Groupe1
    NomLien2 du Groupe1
    NomLien3 du Groupe1

    groupe2
    NomLien1 du Groupe2
    NomLien2 du Groupe2
    ...
    groupeN
    NomLien1 du GroupeN
    Comment puis je faire cela, je suis un peu perdu, je m'embrouille dans mon for-each.

    Merci de votre aide a tous,

  2. #2
    Membre régulier
    Inscrit en
    Février 2005
    Messages
    147
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 147
    Points : 78
    Points
    78
    Par défaut
    Personne n'a une idée??
    Sorry de relancer ce post, mais je ne trouve pas de solution a mon problème.
    ps j'espère que j'ai été assez clair dans ce que je voudrais faire, si ce n'est pas le cas, je peux essayer d'être le plus clair possible.

    Merci a vous

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 34
    Points : 39
    Points
    39
    Par défaut
    je pense, si j'ai bien compris ce que tu veux faire, que ceci devrait répondre à ton besoin :

    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
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:key name="id" match="col[8]" use="."/> 
    <xsl:template match="/"> 
        <xsl:for-each select="//col[generate-id(.)=generate-id(key('id', .)[1])]"> 
          <xsl:sort select="."/> 
          <xsl:value-of select="."/> 
          <xsl:variable name="groupe" select="."/>
          <xsl:text>
    </xsl:text>
    	<xsl:for-each select="//col[7]">
          		<xsl:if test="../col[8] = $groupe">
          				<xsl:value-of select="."/>
          				<xsl:text>
    </xsl:text>
          		</xsl:if>
          </xsl:for-each>
        </xsl:for-each> 
    </xsl:template> 
    </xsl:stylesheet>
    Et ainsi avec un fichier xml en entrée comme suit :

    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
    <?xml version="1.0" encoding="UTF-8"?>
    <begin>
    <row> 
          <col>10</col> 
          <col>1</col> 
          <col>Outsourcer Informations</col> 
          <col>1</col> 
          <col>UOData.html</col> 
          <col></col> 
          <col>9</col> 
          <col>Outsourcer</col> 
       </row> 
    <row> 
          <col>10</col> 
          <col>1</col> 
          <col>Outsourcer Informations</col> 
          <col>1</col> 
          <col>UOData.html</col> 
          <col></col> 
          <col>6</col> 
          <col>Outsourcer2</col> 
       </row> 
       <row> 
          <col>10</col> 
          <col>1</col> 
          <col>Outsourcer Informations</col> 
          <col>1</col> 
          <col>UOData.html</col> 
          <col></col> 
          <col>7</col> 
          <col>Outsourcer2</col> 
       </row> 
          <row> 
          <col>10</col> 
          <col>1</col> 
          <col>Outsourcer Informations</col> 
          <col>1</col> 
          <col>UOData.html</col> 
          <col></col> 
          <col>155</col> 
          <col>Outsourcer4</col> 
       </row>
       </begin>
    On obtient le, fichier suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Outsourcer
    9
    Outsourcer2
    6
    7
    Outsourcer4
    155
    Pour celà j'ai utilisé la fameuse méthode de regroupement Muench et je me suis très largement inspiré d'un post quasi similaire :
    http://www.developpez.net/forums/vie...ghlight=muench

  4. #4
    Membre régulier
    Inscrit en
    Février 2005
    Messages
    147
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 147
    Points : 78
    Points
    78
    Par défaut
    Merci a toi je test et je te tien au courant, ciao ciao

  5. #5
    Membre régulier
    Inscrit en
    Février 2005
    Messages
    147
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 147
    Points : 78
    Points
    78
    Par défaut
    Ok, merci ca fonctionne, mais dernière question :
    quand tu fait des select"." tu fais référence a quoi exactement, col[8]?? bète question mais je suis un noob en xsl !

    Merci a toi

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 34
    Points : 39
    Points
    39
    Par défaut
    select".", en fait ça fait référence au noeud courant, qui dans le cas de notre xsl est effectivement col[8]

  7. #7
    Membre régulier
    Inscrit en
    Février 2005
    Messages
    147
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 147
    Points : 78
    Points
    78
    Par défaut
    Oki thanks,
    un tout grand merci pour ton aide, tu m'enlève une bonne grosse épine du pied

    Ciao ciao

  8. #8
    Membre régulier
    Inscrit en
    Février 2005
    Messages
    147
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 147
    Points : 78
    Points
    78
    Par défaut
    En fait il me reste un dernier problème, c'est le sort je n'arrive pas a faire un sort correct il trie un peu a sa mode, je fait ceci comme sort après le 1er for-each :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    <xsl:sort select="../col[7]" data-type="number" order="ascending"/> 
    <xsl:sort select="../col[8]" data-type="text" order="ascending"/>
    Pour trier d'une part sur col[7] qui est l'orde d'affichage, et d'autre part sur col[8] le group.

    Car pour le moment il me trie le col[7] comme suit, ce qui est assez bizar :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    0 
    1 
    10 
    9 
    7 
    2
    4 
    3
    5 
    8 
    6
    Je ne comprend pas trop d'ou vient l'erreur, car j'utilisai le sort dans mon code avant, et il triai bien, a présent il ne trie plus comme il faut ! Comment dois je adapter ce sort pour qu'il fonctionne avec la nouvelle portion de code que tu m'a donné?

    Merci a toi

  9. #9
    Membre régulier
    Inscrit en
    Février 2005
    Messages
    147
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 147
    Points : 78
    Points
    78
    Par défaut
    En gros il manque juste un sort ici :

    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
     
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:key name="id" match="col[8]" use="."/> 
    <xsl:template match="/"> 
        <xsl:for-each select="//col[generate-id(.)=generate-id(key('id', .)[1])]"> 
          <xsl:sort select="."/> 
          <xsl:value-of select="."/> 
          <xsl:variable name="groupe" select="."/> 
          <xsl:text> </xsl:text> 
       <xsl:for-each select="//col[7]"> 
           ****************
                <xsl:sort select="."/> 
           ****************
                <xsl:if test="../col[8] = $groupe"> 
                      <xsl:value-of select="."/> 
                      <xsl:text> </xsl:text> 
                </xsl:if> 
          </xsl:for-each> 
        </xsl:for-each> 
    </xsl:template> 
    </xsl:stylesheet>
    Autant pour moi, j'ai posé la question trop vite !!

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 34
    Points : 39
    Points
    39
    Par défaut
    Il suffit de replacer le sort au bon endroit et de l'adapter en fonction de l'endroit où on se trouve lorsque l'on parse le fichier xml.

    On remplace donc
    par
    Celà donne donc :

    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:key name="id" match="col[8]" use="."/> 
    <xsl:template match="/"> 
        <xsl:for-each select="//col[generate-id(.)=generate-id(key('id', .)[1])]"> 
          <xsl:sort select="." data-type="text" order="descending"/> 
          <xsl:value-of select="."/> 
          <xsl:variable name="groupe" select="."/>
          <xsl:text>
    </xsl:text>
    	<xsl:for-each select="//col[7]">
    ***************************	
                                    <xsl:sort select="." data-type="number" order="ascending"/>
    ***************************
          		<xsl:if test="../col[8] = $groupe">
          				<xsl:value-of select="."/>
          				<xsl:text>
    </xsl:text>
          		</xsl:if>
          </xsl:for-each>
        </xsl:for-each> 
    </xsl:template> 
    </xsl:stylesheet>
    Et là tu classes dans l'ordre que tu veux

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

Discussions similaires

  1. comment faire ceci
    Par java_developper dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 16/08/2007, 12h55
  2. Calcul/Somme XML / XSL , comment faire ?
    Par Superpoisson dans le forum XSL/XSLT/XPATH
    Réponses: 5
    Dernier message: 23/09/2005, 12h28
  3. [Noob][XML][XSL]Comment faire ceci ??
    Par Devil666 dans le forum XSL/XSLT/XPATH
    Réponses: 5
    Dernier message: 31/08/2005, 16h00
  4. [XSL]Comment faire ceci ?? Mon for-each n'affiche pas tout !
    Par Devil666 dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 27/07/2005, 15h04
  5. [XSL] Comment faire pour trier de cette façon ?
    Par shupa dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 30/06/2005, 17h39

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