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 :

[XML][XSL]Comment atteindre ces 2 header séparément?


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 [XML][XSL]Comment atteindre ces 2 header séparément?
    Bonjour à tous et à toutes,

    voici mon problème, je possède un fichier XML composé d'un seul root nommé deptname et 2 header avec des valeurs distinctes, le premier contient des données concernant mes départments, et le second header celui des profiles de mes users, chacun de ces headers est identifié par un col possèdant chacun un name différent 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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
     
    <?xml version="1.0" encoding="ISO-8859-1"?>
     
    <deptName>
     
    <header>
     
    <col name="DEPT_NAME"/>
     
    </header>
     
    <row>
     
    <col>Contact Center</col>
     
    </row>
     
    <row>
     
    <col>Risk</col>
     
    </row>
     
    <row>
     
    <col>Business Support</col>
     
    </row>
     
    <row>
     
    <col>Traffic Management</col>
     
    </row>
     
    <row>
     
    <col>PSE-ECus</col>
     
    </row>
     
    <header>
     
    <col name="PROFILE_NAME"/>
     
    </header>
     
    <row>
     
    <col>Super Administrator</col>
     
    </row>
     
    <row>
     
    <col>CECU Administrator</col>
     
    </row>
     
    <row>
     
    <col>CECU User</col>
     
    </row>
     
    <row>
     
    <col>Report Writer</col>
     
    </row>
     
    <row>
     
    <col>Simulation Administrator</col>
     
    </row>
     
    <row>
     
    <col>Report User</col>
     
    </row>
     
    <row>
     
    <col>Unit Manager</col>
     
    </row>
     
    <row>
     
    <col>Service Level Watcher</col>
     
    </row>
     
    </deptName>
    Ce que je voudrais faire c'est utiliser les données de mon premier header dans un select ou on sélectionnerai les départments disponibles et le second les profiles disponibles.
    Mais comment puis je faire sa au sein de mon fichier XSL??
    Je ne sais pas comment lui dire, les row/col de ce header là sont des départments et je les mes dans ce select department et idem pour profile.

    Voici ce que j'ai déjà fait pour départment, c'est le meme pour profile:
    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
     
    		<td>Department</td>
    		<td>
    		<xsl:apply-templates select="header/col"/>
     
    			<select name="Department">
    			   <xsl:for-each select="row">
                        	<option>             	       
                        	            <xsl:attribute name="value">
                        	                    <xsl:value-of select="col"></xsl:value-of>
                        	            </xsl:attribute>
                        	            <xsl:value-of select="col"></xsl:value-of>
                        	</option>
                           </xsl:for-each>
               		</select>
               </td>
    Merci d'avance à tous ceux qui pourraient m'aider.
    Ciao

  2. #2
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Bonjour,

    comme tes éléments <header> et <row> sont au même niveau, il va falloir utiliser les axes preceding-sibling ou following-sibling dans tes expressions XPath. D'autre part, pour s'assurer qu'on ne traite que les <row> liées à un header, on utilisera la fonction generate-id() pour identifier le bon <header>. Ce qui donne (à tester) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <xsl:template match="header">
      <xsl:for-each select="following-sibling::row[generate-id(current()) = generate-id(preceding-sibling::header[1])]">
        ...
      </xsl:for-each>
    </xsl:template>
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  3. #3
    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 c'est super, merci a toi, sa marche nickel pour les select.

    Mais mnmt le problème c'est qu'il m'affiche ma page en double ! et en dessous des boutons Add et Reset il m'affiche le nom de departments du 1er header, et en dessous du second affichage les profiles du second header!
    Voici mon code complet, ptet que c'est moi qui est mal mis mon xsl:template: mais sous XML SPY il ne veut pas que je le mette ailleurs !
    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
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
     
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
    <xsl:template match="header">      
    <html> 
    <head>
        <style type="text/css">
               <![CDATA[
               H1 { COLOR: #34007c; FONT-FAMILY: Arial; font-weight: bold;}         
               ]]>
        </style>
     </head>            
     <body style="background-color:#FFFFFF;">
    <xsl:apply-templates select="header/col"/>
    <center>
    <h1>.:: Add a user ::.</h1>
    <form name="log" method="get" action="Add" target="main">
    <table width="500" height="300" border="0" cellpadding="0" cellspacing="0">
    	<tr>
    		<td>Login</td>
    		<td><input type="password" name="Login" size="40" maxlength="256"></input></td>
    	</tr>
    	<tr>
    		<td>First name</td>
    		<td><input type="text" name="Fname" size="40" maxlength="256"></input></td>
    	</tr>
    	<tr>
    		<td>Last name</td>
    		<td><input type="text" name="Lname" size="40" maxlength="256"></input></td>
    	</tr>
    	<tr>
    		<td>Department</td>
    		<td>
    			<select name="Department"> 
      				<xsl:for-each select="following-sibling::row[generate-id(current()) = generate-id(preceding-sibling::header[1])]"> 
                        		<option>            	       
                        	            <xsl:attribute name="value">
                        	                    <xsl:value-of select="col"></xsl:value-of>
                        	            	</xsl:attribute>
                        	            	<xsl:value-of select="col"></xsl:value-of>
                        		</option>
    				</xsl:for-each> 
               		</select>
               </td>
        </tr>
        <tr>
    	     <td>Profile</td>
    	     <td>
    		    	<select name="Profile">
      				<xsl:for-each select="following-sibling::row[generate-id(current()) = generate-id(preceding-sibling::header[2])]"> 
                        		<option>             	       
                        	            <xsl:attribute name="value">
                        	                    <xsl:value-of select="col"></xsl:value-of>
                        	            	</xsl:attribute>
                        	            	<xsl:value-of select="col"></xsl:value-of>
                        		</option>
    				</xsl:for-each>
                		</select>
          	    </td>
       </tr>
       <tr>
    	    <td></td>
    	    <td align="center">
    		      <input type="submit" value="ADD new user"></input>
    		                <xsl:text disable-output-escaping="yes">
    		                      <![CDATA[ &nbsp;&nbsp;&nbsp;]]>
                                 </xsl:text>
    		      <input type="Reset" value="Reset"></input></td>
    	     <td></td>
       </tr>
    </table>
    </form>
    </center>
    </body>
    </html>
    </xsl:template>
    </xsl:stylesheet>

  4. #4
    Membre expérimenté
    Avatar de virgul
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 625
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 625
    Points : 1 666
    Points
    1 666
    Par défaut
    Salut,

    Voila ce qui faut faire:
    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
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    <?xml version="1.0" encoding="UTF-8"?> 
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format"> 
     
    <xsl:template match="/">
    <xsl:apply-templates select="deptName/header[1]"/>
    </xsl:template>
    <xsl:template match="deptName/header">      
    <html> 
    <head> 
        <style type="text/css"> 
               <![CDATA[ 
               H1 { COLOR: #34007c; FONT-FAMILY: Arial; font-weight: bold;}          
               ]]> 
        </style> 
     </head>            
     <body style="background-color:#FFFFFF;"> 
     
    <center> 
    <h1>.:: Add a user ::.</h1> 
    <form name="log" method="get" action="Add" target="main"> 
    <table width="500" height="300" border="0" cellpadding="0" cellspacing="0"> 
       <tr> 
          <td>Login</td> 
          <td><input type="password" name="Login" size="40" maxlength="256"></input></td> 
       </tr> 
       <tr> 
          <td>First name</td> 
          <td><input type="text" name="Fname" size="40" maxlength="256"></input></td> 
       </tr> 
       <tr> 
          <td>Last name</td> 
          <td><input type="text" name="Lname" size="40" maxlength="256"></input></td> 
       </tr> 
       <tr> 
          <td>Department</td> 
          <td> 
             <select name="Department"> 
                  <xsl:for-each select="following-sibling::row[generate-id(current()) = generate-id(preceding-sibling::header[1])]"> 
                              <option>                       
                                       <xsl:attribute name="value"> 
                                               <xsl:value-of select="col"></xsl:value-of> 
                                          </xsl:attribute> 
                                          <xsl:value-of select="col"></xsl:value-of> 
                              </option> 
                </xsl:for-each> 
                     </select> 
               </td> 
        </tr> 
        <tr> 
            <td>Profile</td> 
            <td> 
                 <select name="Profile"> 
                  <xsl:for-each select="following-sibling::row[generate-id(current()) = generate-id(preceding-sibling::header[2])]"> 
                              <option>                        
                                       <xsl:attribute name="value"> 
                                               <xsl:value-of select="col"></xsl:value-of> 
                                          </xsl:attribute> 
                                          <xsl:value-of select="col"></xsl:value-of> 
                              </option> 
                </xsl:for-each> 
                      </select> 
                 </td> 
       </tr> 
       <tr> 
           <td></td> 
           <td align="center"> 
                <input type="submit" value="ADD new user"></input> 
                          <xsl:text disable-output-escaping="yes"> 
                                <![CDATA[ &nbsp;&nbsp;&nbsp;]]> 
                                 </xsl:text> 
                <input type="Reset" value="Reset"></input></td> 
            <td></td> 
       </tr> 
    </table> 
    </form> 
    </center> 
    </body> 
    </html> 
    </xsl:template> 
    </xsl:stylesheet>
    car tu avais les régle par défaut qui se sont activé car tu matchais directement header

    tu l'aivais 2 fois car l'élément header que tu match y est deux fois

    pense a mettre le même encoding sur ton XSLT et ton XML car des fois ca peux foutre la merde iso8895-1 ou utf-8

    Demande si tu veux que je développe un des points!

    ++

    Thierry
    "Life is short don't forget to inhale"
    Mais: "Mieux vaux arriver en retard dans ce monde... qu'en avance à l'autre."

  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 un tout grand merci a toi, sa focntionne nickel.

    Donc voilà si j'ai bien compris ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <xsl:template match="/"> 
    <xsl:apply-templates select="deptName/header[1]"/> 
    </xsl:template> 
    <xsl:template match="deptName/header">
    Je me positionne sur le header[1] et puis seulement je commence a lire le contenu du header et a faire l'affcihage en gros :

  6. #6
    Membre expérimenté
    Avatar de virgul
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 625
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 625
    Points : 1 666
    Points
    1 666
    Par défaut
    Je me positionne sur le header[1] et puis seulement je commence a lire le contenu du header et a faire l'affcihage en gros
    tu te positionne ok mais sur tout ceux (les header et pour chaque tu fait une fois boucle) qui sont la dans ton XML et la je lui dit juste de prendre que le premier pour qu'il ne fasse que la boucle une fois mais tu aurais très bien pu matché sur deptname mais après il aurait fallu changer tes for-each car il ne serait plus a la bonne place!

    Ca sert aussi a qu'il n'utilise pas le règle par défaut qui est un value-of de la balise

    Ce que tu faisais avant tu allais sur header directement ce qui fait que pour tout les éléments au dessus (parent) il copiait simplement le contenu ce qui fait que tu avais cette ligne

    Suis-je clair?

    Thierry
    "Life is short don't forget to inhale"
    Mais: "Mieux vaux arriver en retard dans ce monde... qu'en avance à l'autre."

  7. #7
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Personnellement, j'aurais procédé différemment :
    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
    64
    65
    66
    67
    <?xml version="1.0" encoding="UTF-8"?> 
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format"> 
     
    <xsl:template match="/"> 
    <html> 
    <head> 
        <style type="text/css"> 
               <![CDATA[ 
               H1 { COLOR: #34007c; FONT-FAMILY: Arial; font-weight: bold;}          
               ]]> 
        </style> 
     </head>            
     <body style="background-color:#FFFFFF;"> 
     
    <center> 
    <h1>.:: Add a user ::.</h1> 
    <form name="log" method="get" action="Add" target="main"> 
    <table width="500" height="300" border="0" cellpadding="0" cellspacing="0"> 
       <tr> 
          <td>Login</td> 
          <td><input type="password" name="Login" size="40" maxlength="256"></input></td> 
       </tr> 
       <tr> 
          <td>First name</td> 
          <td><input type="text" name="Fname" size="40" maxlength="256"></input></td> 
       </tr> 
       <tr> 
          <td>Last name</td> 
          <td><input type="text" name="Lname" size="40" maxlength="256"></input></td> 
       </tr> 
       <xsl:apply-templates select="deptName/header"/> 
       <tr> 
           <td></td> 
           <td align="center"> 
                <input type="submit" value="ADD new user"></input> 
                          <xsl:text disable-output-escaping="yes"> 
                                <![CDATA[ &nbsp;&nbsp;&nbsp;]]> 
                                 </xsl:text> 
                <input type="Reset" value="Reset"></input></td> 
            <td></td> 
       </tr> 
    </table> 
    </form> 
    </center> 
    </body> 
    </html> 
    </xsl:template> 
     
    <xsl:template match="header">
       <tr> 
          <td><xsl:value-of select="."/></td> 
          <td> 
             <select name="{.}"> 
                  <xsl:for-each select="following-sibling::row[generate-id(current()) = generate-id(preceding-sibling::header[1])]"> 
                              <option>                        
                                       <xsl:attribute name="value"> 
                                               <xsl:value-of select="col"></xsl:value-of> 
                                          </xsl:attribute> 
                                          <xsl:value-of select="col"></xsl:value-of> 
                              </option> 
                </xsl:for-each> 
              </select> 
            </td> 
        </tr> 
    </xsl:template>
     
    </xsl:stylesheet>
    Puisque le traitement des header est le même dans les deux cas, aux noms près, autant tout factoriser dans un template
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  8. #8
    Membre expérimenté
    Avatar de virgul
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 625
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 625
    Points : 1 666
    Points
    1 666
    Par défaut
    Mesdames et Monsieur juste en dessus de vous, vous pouvez admirez une oeuvre de GrandFather dans toute ca splendeur!!!


    Si tu cherches un disciple, moi en tout cas je suis intéressé!


    ++

    Thierry
    "Life is short don't forget to inhale"
    Mais: "Mieux vaux arriver en retard dans ce monde... qu'en avance à l'autre."

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

Discussions similaires

  1. [WebForms][Xml][Xsl] Comment eviter un décalage des images ?
    Par ekmule dans le forum Général Dotnet
    Réponses: 4
    Dernier message: 14/12/2005, 15h07
  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. mise en page (Header and Footer) en XML-XSL.
    Par christine dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 01/03/2004, 16h31
  5. XML/XSL vers HTML: comment transformer les linefeed en <B
    Par AlainM dans le forum XSL/XSLT/XPATH
    Réponses: 5
    Dernier message: 18/11/2003, 12h30

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