[RESOLU] répéter une balise

répéter une balise [RESOLU] - XML/XSL - Programmation

Marsh Posté le 16-06-2008 à 13:08:56    

Bonjour,
 
Je bloc sur la répétition de la balise <xsl:value-of select="Description"/>. Ce que je voudrais faire c’est rajouter la seconde balise <Description> s’il y en a…
Actuellement il répète la même balise…
Je début complètement en programmation,  
 
Ci-dessous un bout de codes
 

Et merci d’avance

 

Mon XML

Code :
  1. <GED_Bancs>
  2. <Logo>logo-glpi.png</Logo>
  3. <Lien>Images\logo-glpi.png</Lien>
  4. <Nom>CR_Jorge [Bancs]</Nom>
  5. <Type>CR</Type>
  6. <Redacteur>Jorge</Redacteur>
  7. <Revision>20080221</Revision>
  8. <Description> Trop Bien, mais pas encore top le collage XML</Description>
  9. <Description>Plus que cette etape est voila un pat de plus</Description>
  10. <Commentaire>Encore un peux et j'y arriverais</Commentaire>
  11. </GED_Bancs>


 

Mon XSL

Code :
  1. <xsl:template name="ContactBlock">   <!-- Block Contact -->
  2. <table id="Tableau_V02" width="100%" height="100%" cellspacing="0" cellpadding="0">
  3.  <tBody>
  4.   <tr>   <!-- Description du document-->
  5.    <td>
  6.     <div class="Description">
  7.      <xsl:value-of select="Description"/>
  8.      <br/>
  9.      <xsl:value-of select="Description"/>
  10.     </div>
  11.    </td>
  12.   </tr>
  13.  </tBody>
  14. </table>
  15. </xsl:template>


 
Jo


Message édité par JojoSs75 le 07-03-2009 à 18:43:55
Reply

Marsh Posté le 16-06-2008 à 13:08:56   

Reply

Marsh Posté le 17-06-2008 à 09:26:37    

Pas sur qu'on puisse utiliser une expression XPath ici, essaye:

Code :
  1. <xsl:value-of select="Description[1]"/>
  2. <xsl:value-of select="Description[2]"/>

Reply

Marsh Posté le 17-06-2008 à 09:31:37    

Pourquoi ne pas simplement itérer sur les balises Description?
 

Code :
  1. <div class="Description">
  2.    <xsl:for-each select="Description">
  3.        <xsl:value-of select="."/><br/>
  4.    </xsl:for-each>
  5. </div>


[:spamafote]


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 17-06-2008 à 10:04:33    

Heu ... c'est pas vraiment dans l'optique XSL ça ...
ça serait mieux d'utiliser une solution à base de templates .. De tête je dirais quelque chose style mettre un apply template sur //Description (à voir si ça colle avec le reste de ton arbo), et créer un template qui te fait print le value + le br..

Reply

Marsh Posté le 24-06-2008 à 19:24:09    

avander a écrit :

Pas sur qu'on puisse utiliser une expression XPath ici, essaye:

Code :
  1. <xsl:value-of select="Description[1]"/>
  2. <xsl:value-of select="Description[2]"/>



 
Merci Avander de ta réponse,
Malheuresement elle repete la premiere balise deux fois et meme s'il y en a une elle le repete aussi.
 
jojoSs


Message édité par JojoSs75 le 28-06-2008 à 11:27:04
Reply

Marsh Posté le 24-06-2008 à 19:26:16    

masklinn a écrit :

Pourquoi ne pas simplement itérer sur les balises Description?
 

Code :
  1. <div class="Description">
  2.    <xsl:for-each select="Description">
  3.        <xsl:value-of select="."/><br/>
  4.    </xsl:for-each>
  5. </div>


[:spamafote]


 
Merci Masklinn de ta réponse,  
Malheuresement elle repete aussi la premiere balise deux fois.  
 
jojoSs


Message édité par JojoSs75 le 28-06-2008 à 11:27:15
Reply

Marsh Posté le 24-06-2008 à 20:57:53    

esox_ch a écrit :

Heu ... c'est pas vraiment dans l'optique XSL ça ...
ça serait mieux d'utiliser une solution à base de templates .. De tête je dirais quelque chose style mettre un apply template sur //Description (à voir si ça colle avec le reste de ton arbo), et créer un template qui te fait print le value + le br..


 
Bonjour esox_ch, merci pour la reponse.
 
Par contre je bloc un peux, voici le template que j'ai crée

Code :
  1. <tr>   <!-- Description du document-->
  2. <td colspan="3" rowspan="1">
  3.  <div class="Description">
  4.   <xsl:apply-templates select="Description">
  5.   </xsl:apply-templates>
  6.  </div>
  7. </td>
  8. </tr>


 
Par contre je vois pas du tous ou metre le retour chariot<br>. Actuellement j'ai une ligne complete avec tous les commentaires mis bout a bout.
j'ai tester aussi celuis ci mais ils ne bouclent pas

Code :
  1. <div class="Commentaire">
  2. <xsl:call-template name="Tps_Commentaire"/>
  3. </div>
  4. <xsl:template name="Tps_Commentaire">
  5. <xsl:for-each select=".">
  6.  <xsl:value-of select="Commentaire"/><br/>
  7. </xsl:for-each>
  8. </xsl:template>


 
jojoSs


Message édité par JojoSs75 le 28-06-2008 à 11:27:26
Reply

Marsh Posté le 27-06-2008 à 09:56:11    

Pourrais tu préciser quel parseur tu utilise, parce mon code fonctionne parfaitement avec MSXML...
 

<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<GED_Bancs>
  <Logo>logo-glpi.png</Logo>
  <Lien>Images\logo-glpi.png</Lien>
  <Nom>CR_Jorge [Bancs]</Nom>
  <Type>CR</Type>
  <Redacteur>Jorge</Redacteur>
  <Revision>20080221</Revision>
  <Description> Trop Bien, mais pas encore top le collage XML</Description>
  <Description>Plus que cette etape est voila un pat de plus</Description>
  <Commentaire>Encore un peux et j'y arriverais</Commentaire>
</GED_Bancs>
<!-- eof -->


 

<?xml version="1.0" encoding="ISO-8859-1"?>
 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
 
<!-- general settings -->
  <xsl:output method="html" omit-xml-declaration="no" encoding="ISO-8859-1"/>
 
<!-- parameters -->
 
<!-- global variables -->
 
<!-- transformations -->
  <xsl:key name="lookup" match="infoItem" use="@id"/>
 
  <xsl:template match="/">
    <xsl:text>Start XSLT
    </xsl:text>
    <xsl:apply-templates/>
  </xsl:template>
 
 
<xsl:template match="GED_Bancs">   <!-- Block Contact -->
 
<table id="Tableau_V02" width="100%" height="100%" cellspacing="0" cellpadding="0">
  <tBody>
   <tr>   <!-- Description du document-->
    <td>
     <div class="Description">
      <xsl:value-of select="Description[1]"/>
      <br/>
      <xsl:value-of select="Description[2]"/>
     </div>
    </td>
   </tr>
  </tBody>
 </table>
 
</xsl:template>
 
</xsl:stylesheet>
<!-- eof -->


 
et j'obtiens:

Start XSLT
    <table id="Tableau_V02" width="100%" height="100%" cellspacing="0" cellpadding="0">
<tBody>
<tr>
<td>
<div class="Description"> Trop Bien, mais pas encore top le collage XML<br>
Plus que cette etape est voila un pat de plus</div>
</td>
</tr>
</tBody>
</table>

Message cité 1 fois
Message édité par avander le 27-06-2008 à 09:57:09
Reply

Marsh Posté le 27-06-2008 à 22:01:14    

avander a écrit :

Pourrais tu préciser quel parseur tu utilise, parce mon code fonctionne parfaitement avec MSXML...
 
 
 
 
et j'obtiens:

Start XSLT
    <table id="Tableau_V02" width="100%" height="100%" cellspacing="0" cellpadding="0">
<tBody>
<tr>
<td>
<div class="Description"> Trop Bien, mais pas encore top le collage XML<br>
Plus que cette etape est voila un pat de plus</div>
</td>
</tr>
</tBody>
</table>



Bonjour avander
 
En faite j'utilie auun parseur, je tape mon code sous NotePad++ et le verifie directement sous EI.
je peut t'envoyer mon xml et xsl si tu veux?
 
Une question:
pourquoi utilises-tu: "xsl:key"
 
Et aussi: si on vient à rajouter une troisiéme balise <Description> dois-je rajouter <xsl:value-of select="Description[3]"/>etc...
 
Merci pour tous

Message cité 1 fois
Message édité par JojoSs75 le 28-06-2008 à 12:29:58
Reply

Marsh Posté le 28-06-2008 à 11:58:00    

:hello: Bonjour :hello:,
 
Suite à la remarque de "esox_ch", je suis passé sur un template. Malheureusement j'arrive toujours pas à répéter ma boucle. j'y comprend plus rien..... :??:  
:pfff: mes début dans le xml/xsl me font des cheveux gris :(
 
Voici mon xml:

Code :
  1. <GED_Moteur>
  2. <DOC>
  3.  <Logo>logo-glpi.png</Logo>
  4.  <Lien>Images\logo-glpi.png</Lien>
  5.  <Nom>Tr_Jorge [Moteur]</Nom>
  6.  <Type>Traitement</Type>
  7.  <Redacteur>Jorge</Redacteur>
  8.  <Revision>20060221</Revision>
  9. </DOC>
  10. <Infos>
  11.  <Description>Desc0.0_Fichier de traitement de données</Description>
  12.  <Commentaire>Com0.1_Generalisation pour le collage intuitif</Commentaire>
  13.  <Commentaire>Com0.2_de donnée Morphée sur feuille prés-formaté d'Excel</Commentaire>
  14. </Infos>
  15. </GED_Moteur>


 
Et voici mon xsl

Code :
  1. <xsl:template name="Block_DOC">
  2. <table id="Tableau_V02" width="100%" height="100%" cellspacing="0" cellpadding="0">
  3.  <tBody>
  4.   <tr>
  5. <!-- Barre de gauche -->
  6.    <td class="Tableau_Gauche" colspan="1" rowspan="3"/>
  7. <!-- Le LOGO du fichier -->
  8.    <td  class="Logo" colspan="1" rowspan="3">
  9.     <div>
  10.      <a href="{$Liensrc}" target="_blank">
  11.       <img class="Logo_img" alt="" src="Images/Logo/{$logosrc}"/>
  12.      </a>
  13.     </div>
  14.    </td>
  15. <!-- Personne qui a rédigé le doc  -->
  16.    <td>
  17.     <div class="Redacteur">
  18.      <xsl:value-of select="Redacteur"/>
  19.     </div>
  20.    </td>
  21. <!-- Type de fichier  -->
  22.    <td>
  23.     <div class="Type">
  24.      <xsl:value-of select="Type"/>
  25.     </div>
  26.    </td>
  27. <!-- date -->
  28.    <td>
  29.     <div class="Revision">
  30.      <xsl:value-of select="Revision"/>
  31.     </div>
  32.    </td>
  33. <!-- barre de droite -->
  34.    <td class="Tableau_Droite" colspan="1" rowspan="3">
  35.    </td>
  36.   </tr>
  37.   <tr>
  38. <!-- Description du document-->
  39.    <td colspan="3" rowspan="1">
  40.     <div class="Description">
  41.      <xsl:value-of select="Description"/>
  42.     </div>
  43.    </td>
  44.   </tr>
  45.   <tr>
  46. <!-- Commentaire du document -->
  47.    <td class="Tableau_Space" colspan="6" rowspan="1">
  48.     <div class="Commentaire">
  49.      <xsl:call-template name="Tps_Commentaire6"/>
  50.     </div>
  51.    </td>
  52.   </tr>
  53. <!-- block partie intermédiaire -->
  54.   <tr>
  55. <!-- espace entre Block -->
  56.    <td class="Tableau_Space" colspan="6" rowspan="1"/>
  57.   </tr>
  58. </xsl:template>
  59. <xsl:template name="Tps_Commentaire6">
  60. <xsl:for-each select="./Infos">
  61.  <xsl:value-of select="Commentaire"/>
  62. </xsl:for-each>
  63. </xsl:template>


 
Je suis sure que ça devrais marché mais je doit oublier quelque chose... mais je vois pas quoi :cry:

Reply

Marsh Posté le 28-06-2008 à 11:58:00   

Reply

Marsh Posté le 30-06-2008 à 15:22:53    

JojoSs75 a écrit :


...
Une question:
pourquoi utilises-tu: "xsl:key"
 
Et aussi: si on vient à rajouter une troisiéme balise <Description> dois-je rajouter <xsl:value-of select="Description[3]"/>etc...
 
Merci pour tous


 
Oublie le xsl:key c'est une relique issu d'un copier/coller...  
 
Description[3] c'est une façon de faire, autrement il faut prévoir un template pour l'élément Description et tester sa position avec position().

Reply

Marsh Posté le 30-06-2008 à 15:34:00    

JojoSs75 a écrit :

:hello: Bonjour :hello:,
 
Suite à la remarque de "esox_ch", je suis passé sur un template. Malheureusement j'arrive toujours pas à répéter ma boucle. j'y comprend plus rien..... :??:  
:pfff: mes début dans le xml/xsl me font des cheveux gris :(
...
Je suis sure que ça devrais marché mais je doit oublier quelque chose... mais je vois pas quoi :cry:


 

<?xml version="1.0" encoding="ISO-8859-1"?>
 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
 
<!-- general settings -->
  <xsl:output method="html" omit-xml-declaration="no" encoding="ISO-8859-1"/>
 
<!-- parameters -->
 
<!-- global variables -->
 
<!-- transformations -->
  <xsl:key name="lookup" match="infoItem" use="@id"/>
 
  <xsl:template match="/">
    <xsl:text>Start XSLT
    </xsl:text>
    <xsl:apply-templates /><!-- càd. parcourir l'arbre xml et appliquer les templates concordant -->
  </xsl:template>
 
 
<xsl:template match="GED_Bancs"><!-- applique ce template à l'élément GED_Bancs -->
 
<table id="Tableau_V02" width="100%" height="100%" cellspacing="0" cellpadding="0">
  <tBody>
   <tr>   <!-- Description du document-->
    <td>
     <div class="Description">
      <xsl:value-of select="Description[1]"/>
      <br/>
      <xsl:value-of select="Description[2]"/>
     </div>
    </td>
   </tr>
  </tBody>
 </table>
 
</xsl:template>
 
</xsl:stylesheet>
<!-- eof -->


 
Es-tu bien sur d'avoir compris le méchanisme de base d'une transformation XSLT? C'est un processus assez différent de la programmation procédurale et/ou objet.  
Les débuts sont souvent laborieux... mais une fois que le déclic se produit, on ne peux qu'être admiratif devant la beauté de cette méchanique.  :ange:  
 
Le moteur de transformation traverse l'arbre xml et va vérifier pour chaque élément trouvé si il existe un template correspondant dans le stylesheet. D'où l'importance d'utiliser xsl:template match="nom d'un élément" et non xsl:template name="machin" qui est un named template ( comparable a une fonction).


Message édité par avander le 01-07-2008 à 11:44:01
Reply

Marsh Posté le 30-06-2008 à 15:53:50    

Exemple avec 3 descriptions et un template adhoc:
 

<?xml version="1.0" encoding="ISO-8859-1"?>
 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
 
<!-- general settings -->
  <xsl:output method="html" omit-xml-declaration="no" encoding="ISO-8859-1"/>
 
<!-- parameters -->
 
<!-- global variables -->
 
<!-- transformations -->
  <xsl:template match="/"><!-- amorce les transformations -->
    <xsl:text>Start XSLT
    </xsl:text>
    <xsl:apply-templates/>
  </xsl:template>
 
 
<xsl:template match="GED_Bancs"><!-- template a appliquer lorsque le moteur trouve un élément 'GED_Bancs' -->
 
<table id="Tableau_V02" width="100%" height="100%" cellspacing="0" cellpadding="0">
  <tBody>
   <tr>   <!-- Description du document-->
    <td>
     <div class="Description">
       <xsl:apply-templates select="Description" /><!-- on limite la traversee aux elements 'Description' -->
<!-- ancienne version desactivee
      <xsl:value-of select="Description[1]"/>
      <br/>
      <xsl:value-of select="Description[2]"/>
-->
     </div>
    </td>
   </tr>
  </tBody>
 </table>
 
</xsl:template>
 
<xsl:template match="Description"><!-- template a appliquer lorsque le moteur trouve un element 'Description' -->
  <xsl:value-of select="position()"/><xsl:text>.</xsl:text>
  <xsl:value-of select="text()"/>
  <xsl:if test="position()!=last()">
 <br />
  </xsl:if>
  <xsl:text>
</xsl:text><!-- bidouille pour ajouter un retour a la ligne en xsl -->
</xsl:template>
 
</xsl:stylesheet>
<!-- eof -->


 
et le résultat:

Start XSLT
    <table id="Tableau_V02" width="100%" height="100%" cellspacing="0" cellpadding="0">
<tBody>
<tr>
<td>
<div class="Description">1. Trop Bien, mais pas encore top le collage XML<br>
2.Plus que cette etape est voila un pat de plus<br>
3.Courage, c'est la troisième description!
</div>
</td>
</tr>
</tBody>
</table>

Message cité 1 fois
Message édité par avander le 01-07-2008 à 11:47:45
Reply

Marsh Posté le 30-06-2008 à 23:53:07    

avander a écrit :

Exemple avec 3 descriptions et un template adhoc:
 


<!-- eof -->


 
et le résultat:


 


 


 
OUaou,
 
merci beaucoup de toute ces explication,je vais lire ca doucement demain et le tester ce week-end
 
Encore merci beaucoup de ton aide...
 
Jojoss

Reply

Marsh Posté le 01-07-2008 à 11:48:54    

Pas de quoi, jette un oeuil au commentaires dans le code.  :jap:

Reply

Marsh Posté le 23-02-2009 à 21:51:39    

avander a écrit :

Pas de quoi, jette un oeuil au commentaires dans le code.  :jap:


 
 
Merci beaucoup Avander, ça marche du tuner.
 
Desoler j'ai pas pu repondre plus tot, j'ai recommencer mon code cette hiver.
 
C'est trop cool Merci beaucoup de ton aide.
 
JojoSs

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed