Re: XSL unique pour XML différent

COUTHURES Alain <[email protected]> Fri, 06 Apr 2007 11:47:57 +0200
Newsgroups gmane.text.xml.french.tech
Message-ID <[email protected]>
J'ai une question complémentaire :
Je m'aperçois que le document XML n'est pas homogène dans sa logique...

Parfois on a un noeud du style :

<A>
  <B>val1</B>
  <C>
    <D>
      <E>val2</E>
    </D>
    <D>
      <E>val3</E>
    </D>
  </C>
</A>

et d'autres fois, on ne met pas le noeud de regroupement C :

<A>
  <B>val1</B>
  <D>
     <E>val2</E>
  </D>
  <D>
    <E>val3</E>
  </D>
</A>

Faire un algo pour un document avec regroupement systématique (ou 
l'inverse) serait plus simple que de faire un algo combinant ces deux 
possibilités...

A chaque fois que je construis moi-même un document XML, je me pose 
toujours la question de mettre ou non un noeud de regroupement mais ne 
serait-il pas possible pour vous de choisir une seule logique, une fois 
pour toute, dans un même document ?

Alain COUTHURES
<agenceXML>
http://www.agencexml.com

Thibaut Gabelle a écrit :
> Là j'ai pris un exemple parmi d'autres, on pourrait très bien avoir quelque
> chose de complètement différent (la liste des mères et ses enfants...)
> Donc la profondeur est constante, mais par type de XML.
>
> -----Message d'origine-----
> De : [email protected] [mailto:[email protected]] De la part
> de COUTHURES Alain
> Envoyé : vendredi 6 avril 2007 09:25
> À : [email protected]
> Objet : [xml-tech] Re: XSL unique pour XML différent
>
> Re-bonjour,
> Ca devient plus clair pour moi avec l'exemple concret !
>
> Est-ce que, en fait, la profondeur des éléments est constante ? On a 
> toujours /root/structure/suivi-budg/exercice/section/budget ?
>
> Alain COUTHURES
> <agenceXML>
> http://www.agenceXML.com
>
> Thibaut Gabelle a écrit :
>   
>> Bonjour et merci pour votre attention,
>>
>> En fait ce XML est le résultat d'une recherche. Et je veux donc afficher
>>     
> ce
>   
>> résultat qui est représenté de manière arborescente dans le XML de manière
>> "aplatie" en HTML.
>> Donc en fait dans mon tableau j'aurais une ligne par élément de premier
>> niveau, ensuite autant de colonne que s'il y a d'éléments "non racine"
>>     
> sous
>   
>> la forme <nom-element>val-element</nom-element>.
>>
>> Si je prends un exemple de XML plus concret. Les budgets par exercice et
>>     
> par
>   
>> section d'une liste de structure. 
>> Voilà le XML de départ (qui sera donc répété pour X structure) : le nombre
>> de section, d'exercice, de budget, étant totalement variable.
>>
>> <root>
>>   <structure>
>>     <libelle>xmlfr.org</libelle>
>>     <type-str>Site internet</type-str>
>>     <suivi-budg>
>>       <exercice>
>>         <annee>2006</annee>
>>         <plan>M22</plan>
>>         <section>
>>           <type>Hébergement</type>
>>           <budget>
>>             <libelle-budg>Budget Herbergement proposé</libelle-budg>
>>             <type-budg>B</type-budg>
>>           </budget>
>>           <budget>
>>             <libelle-budg>Budget Herbergement alloué</libelle-budg>
>>             <type-budg>B</type-budg>
>>           </budget>          
>>         </section>
>>         <section>
>>           <type>Restauration</type>
>>           <budget>
>>             <libelle-budg>Budget Restau proposé</libelle-budg>
>>             <type-budg>B</type-budg>
>>           </budget>
>>         </section>
>>       </exercice>   
>>       <exercice>
>>         <annee>2007</annee>
>>         <plan>M22</plan>
>>         <section>
>>           <type>Hébergement</type>
>>           <budget>
>>             <libelle-budg>Budget Herbergement proposé</libelle-budg>
>>             <type-budg>B</type-budg>
>>           </budget>
>>         </section>
>>         <section>
>>           <type>Restauration</type>
>>           <budget>
>>             <libelle-budg>Budget Restau proposé</libelle-budg>
>>             <type-budg>B</type-budg>
>>           </budget>
>>           <budget>
>>             <libelle-budg>Budget Restau proposé 2</libelle-budg>
>>             <type-budg>B</type-budg>
>>           </budget>          
>>           <budget>
>>             <libelle-budg>Budget Restau alloué</libelle-budg>
>>             <type-budg>B</type-budg>
>>           </budget>
>>         </section>
>>       </exercice>      
>>     <suivi-budg>
>>   <structure>
>> </root>
>>
>> Voilà le HTML souhaité
>>
>> <TABLE>
>> <TR>
>>   <TD>xmlfr.org</TD>
>>   <TD>Site internet</TD>
>>   <TD>
>>     <TABLE>
>>     <TR>
>>       <TD>2006</TD>
>>       <TD>M22</TD>
>>       <TD>
>>         <TABLE>
>>         <tr>
>>           <td>Hébergement</td>
>>           <td>
>>             <table>
>>             <tr>
>>               <td>Budget Herbergement proposé</td>
>>               <td>B</td>
>>             </tr>
>>             <tr>
>>               <td>Budget Herbergement alloué</td>
>>               <td>B</td>
>>             </tr>
>>             </table>
>>           </td>
>>         </tr>
>>         <tr>
>>           <td>Restauration</td>
>>           <td>
>>             <table>
>>             <tr>
>>               <td>Budget Restau proposé</td>
>>               <td>B</td>
>>             </tr>
>>             </table>
>>           </td>
>>         </tr>
>>         </table>
>>       </TD>
>>     </TR>
>>     <TR>
>>       <TD>2007</TD>
>>       <TD>M22</TD>
>>       <TD>
>>         <table>
>>         <tr>
>>           <td>Hébergement</td>
>>           <td>
>>             <table>
>>             <tr>
>>               <td>Budget Herbergement proposé</td>
>>               <td>B</td>
>>             </tr>
>>             </table>
>>           </td>
>>         </tr>
>>         <tr>
>>           <td>Restauration</td>
>>           <td>
>>             <table>
>>             <tr>
>>               <td>Budget Restau proposé 1</td>
>>               <td>B</td>
>>             </tr>
>>             <tr>
>>               <td>Budget Restau proposé 2</td>
>>               <td>B</td>
>>             </tr>
>>             <tr>
>>               <td>Budget Restau alloué</td>
>>               <td>B</td>
>>             </tr>
>>             </table>
>>           </td>
>>         </tr>
>>         </table>
>>       </TD>
>>     </TR>
>>     </TABLE>
>>   </TD>
>> </TR>
>> </TABLE>
>>
>> -----Message d'origine-----
>> De : [email protected] [mailto:[email protected]] De la
>>     
> part
>   
>> de COUTHURES Alain
>> Envoyé : vendredi 6 avril 2007 06:47
>> À : [email protected]
>> Objet : [xml-tech] Re: XSL unique pour XML différent
>>
>> Bonjour,
>>
>> J'ai du mal à comprendre la structure des fichiers en question...
>>
>> A la lecture, il me semble que ce sont les éléments col1, col2, col3 et 
>> col4 (est-ce limité à 4 ?) qui doivent être "simplement" présentés dans 
>> une table avec saut de ligne chaque fois que l'ordre des colonnes 
>> l'impose et indépendamment de leurs parents.
>>
>> L'exemple XSL joint crée des tables HTML imbriquées : est-ce bien ce qui 
>> doit être construit ?
>>
>> Bien cordialement,
>>
>> Alain COUTHURES
>> <agenceXML>
>> http://www.agenceXML.com
>>
>> Thibaut Gabelle a écrit :
>>   
>>     
>>> Bonjour,
>>>  
>>>
>>> Voici mon besoin : je veux appliquer une transformation XSLT à des
>>>     
>>>       
>> fichiers
>>   
>>     
>>> XML pouvant avoir une structure différente, (1-n ; 1-n-n ;...) et pour
>>>     
>>>       
>> lequel
>>   
>>     
>>> je ne connais pas le nom des éléments.
>>> Ci-dessous des exemples de XML avec le résultat souhaité en HTML.
>>>
>>> Je voudrais savoir si cela est réellement faisable, sachant que je veux
>>> qu'un seul XSL générique.
>>>
>>> Je débute dans ce domaine et pour l'instant, les XSL que j'arrive à faire
>>>     
>>>       
>> ne
>>   
>>     
>>> répondent pas à tous les cas de figure.
>>>
>>>  
>>>
>>> Merci beaucoup.
>>>
>>>  
>>>
>>> Exemple de XSL
>>>
>>>  
>>>
>>> <?xml version="1.0" encoding="UTF-8"?>
>>>
>>> <xsl:stylesheet version="1.0"
>>> xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
>>>
>>>   <xsl:output method="html" indent="yes"/>
>>>
>>>  
>>>
>>>   <!-- Template colonne -->
>>>
>>>   <xsl:template name="colonne">
>>>
>>>     <xsl:if test="count(*) &gt;= 1">
>>>
>>>       <td>
>>>
>>>       <table border="1">
>>>
>>>       <xsl:for-each select="*">
>>>
>>>         <tr>
>>>
>>>           <xsl:call-template name="colonne"/>
>>>
>>>         </tr>
>>>
>>>       </xsl:for-each>
>>>
>>>       </table>
>>>
>>>       </td>     
>>>
>>>     </xsl:if>
>>>
>>>     <xsl:if test="count(*) = 0">
>>>
>>>       <td><xsl:value-of select="."/></td>
>>>
>>>     </xsl:if>
>>>
>>>   </xsl:template>
>>>
>>>   <!-- Fin Template colonne -->
>>>
>>>  
>>>
>>>   <xsl:template match="root">
>>>
>>>   <table border="1">
>>>
>>>  
>>>
>>>     <!-- Pour Chaque ligne -->
>>>
>>>     <xsl:for-each select="*">
>>>
>>>       <tr>
>>>
>>>       <!-- Colorer une ligne sur 2 -->
>>>
>>>       <xsl:if test="(position() mod 2)=0">
>>>
>>>         <xsl:attribute name="bgcolor">green</xsl:attribute>
>>>
>>>       </xsl:if>
>>>
>>>  
>>>
>>>       <!-- Pour chaque colonne -->
>>>
>>>       <xsl:for-each select="*">
>>>
>>>         <xsl:call-template name="colonne"/>
>>>
>>>       </xsl:for-each>
>>>
>>>       </tr>
>>>
>>>     </xsl:for-each>
>>>
>>>  
>>>
>>>   </table>
>>>
>>>   </xsl:template>
>>>
>>>  
>>>
>>> </xsl:stylesheet>
>>>
>>>  
>>>
>>> Exemple XML 1
>>>
>>>  
>>>
>>> <?xml version="1.0" encoding="UTF-8"?>
>>>
>>> <root>
>>>
>>>   <noeud>
>>>
>>>     <col1>Val 1</col1>
>>>
>>>     <col2>Val 2</col2>
>>>
>>>     <col3>Val 3</col3>
>>>
>>>   </noeud>
>>>
>>>   <noeud>
>>>
>>>     <col1>Val 1</col1>
>>>
>>>     <col2>Val 2</col2>
>>>
>>>     <col3>Val 3</col3>
>>>
>>>     <elements>
>>>
>>>        <element>
>>>
>>>           <col4>Val 4</col4>
>>>
>>>        </element>
>>>
>>>        <element>
>>>
>>>           <col4>Val 4</col4>
>>>
>>>        </element>
>>>
>>>     </elements>
>>>
>>>   </noeud>
>>>
>>> </root>
>>>
>>>  
>>>
>>> Résultat HTML 1 souhaité
>>>
>>>
>>> -------Val1-----Val2-----Val3
>>> -------Val1-----Val2-----Val3-----Val4------
>>> -----------------------------------------Val4------
>>>
>>>  
>>>
>>> Exemple XML 2
>>>
>>>  
>>>
>>> <?xml version="1.0" encoding="UTF-8"?>
>>>
>>> <root>
>>>
>>>   <noeud1>
>>>
>>>      <col1>Val1</col1>
>>>
>>>      <noeud2>
>>>
>>>        <col2>Val2</col2>
>>>
>>>        <noeud3>
>>>
>>>           <col3>Val3</col3>
>>>
>>>        </noeud3>
>>>
>>>        <noeud3>
>>>
>>>           <col3>Val4</col3>
>>>
>>>        </noeud3>
>>>
>>>      </noeud2>
>>>
>>>   </noeud1>
>>>
>>>   <noeud1>
>>>
>>>      <col1>Val1</col1>
>>>
>>>      <noeud2>
>>>
>>>        <col2>Val2</col2>
>>>
>>>        <noeud3>
>>>
>>>           <col3>Val3</col3>
>>>
>>>        </noeud3>
>>>
>>>      </noeud2>
>>>
>>>   </noeud1>
>>>
>>> </root>
>>>
>>>  
>>>
>>> Résultat HTML 2 souhaité 
>>>
>>>  
>>>
>>> -------Val1-----Val2-----Val3
>>> ------------------------------Val4
>>> -------Val1-----Val2-----Val3
>>>
>>>  
>>>
>>> Exemple XML 3
>>>
>>>  
>>>
>>> <?xml version="1.0" encoding="UTF-8"?>
>>>
>>> <root>
>>>
>>>   <noeud1>
>>>
>>>      <col1>Val1</col1>
>>>
>>>      <noeud2>
>>>
>>>        <noeud3>
>>>
>>>          <col2>Val2</col2> 
>>>
>>>          <noeud4>
>>>
>>>             <noeud5>
>>>
>>>                <col3>Val3</col3>
>>>
>>>             </noeud5>
>>>
>>>             <noeud5>
>>>
>>>                <col3>Val4</col3>
>>>
>>>             </noeud5>
>>>
>>>          </noeud4>
>>>
>>>        </noeud3>
>>>
>>>      </noeud2>
>>>
>>>    </noeud1>
>>>
>>>   <noeud1>
>>>
>>>      <col1>Val1</col1>
>>>
>>>      <noeud2>
>>>
>>>        <noeud3>
>>>
>>>          <col2>Val2</col2> 
>>>
>>>          <noeud4>
>>>
>>>             <noeud5>
>>>
>>>                <col3>Val3</col3>
>>>
>>>             </noeud5>
>>>
>>>          </noeud4>
>>>
>>>        </noeud3>
>>>
>>>      </noeud2>
>>>
>>>    </noeud1>
>>>
>>> </root>
>>>
>>>  
>>>
>>> Résultat HTML 3 souhaité 
>>>
>>>  
>>>
>>> -------Val1-----Val2-----Val3
>>> ------------------------------Val4
>>> -------Val1-----Val2-----Val3
>>>
>>>  
>>>
>>>
>>>
>>> --
>>> Devenez redacteur <XML>fr et contribuez au developpement du
>>> xml francophone (http://xmlfr.org/infos/redacteurs/) !
>>>
>>> Liste de diffusion "[email protected]" (http://xmlfr.org).
>>>
>>> Cette liste est a votre disposition pour discuter en francais de 
>>> tout sujet technique lie a XML.
>>>
>>> Pour resilier votre abonnement, envoyez un message contenant 
>>> la commande "unsubscribe" a [email protected]
>>> (mailto:[email protected]?Subject=unsubscribe)
>>>
>>>
>>>   
>>>     
>>>       
>> --
>> Devenez redacteur <XML>fr et contribuez au developpement du
>> xml francophone (http://xmlfr.org/infos/redacteurs/) !
>>
>> Liste de diffusion "[email protected]" (http://xmlfr.org).
>>
>> Cette liste est a votre disposition pour discuter en francais de 
>> tout sujet technique lie a XML.
>>
>> Pour resilier votre abonnement, envoyez un message contenant 
>> la commande "unsubscribe" a [email protected]
>> (mailto:[email protected]?Subject=unsubscribe)
>>
>>
>>
>>
>> --
>> Devenez redacteur <XML>fr et contribuez au developpement du
>> xml francophone (http://xmlfr.org/infos/redacteurs/) !
>>
>> Liste de diffusion "[email protected]" (http://xmlfr.org).
>>
>> Cette liste est a votre disposition pour discuter en francais de 
>> tout sujet technique lie a XML.
>>
>> Pour resilier votre abonnement, envoyez un message contenant 
>> la commande "unsubscribe" a [email protected]
>> (mailto:[email protected]?Subject=unsubscribe)
>>
>>
>>   
>>     
>
>
>
> --
> Devenez redacteur <XML>fr et contribuez au developpement du
> xml francophone (http://xmlfr.org/infos/redacteurs/) !
>
> Liste de diffusion "[email protected]" (http://xmlfr.org).
>
> Cette liste est a votre disposition pour discuter en francais de 
> tout sujet technique lie a XML.
>
> Pour resilier votre abonnement, envoyez un message contenant 
> la commande "unsubscribe" a [email protected]
> (mailto:[email protected]?Subject=unsubscribe)
>
>
>
>
> --
> Devenez redacteur <XML>fr et contribuez au developpement du
> xml francophone (http://xmlfr.org/infos/redacteurs/) !
>
> Liste de diffusion "[email protected]" (http://xmlfr.org).
>
> Cette liste est a votre disposition pour discuter en francais de 
> tout sujet technique lie a XML.
>
> Pour resilier votre abonnement, envoyez un message contenant 
> la commande "unsubscribe" a [email protected]
> (mailto:[email protected]?Subject=unsubscribe)
>
>
>