Re: XSL unique pour XML différent

"Thibaut Gabelle" <[email protected]> Fri, 6 Apr 2007 15:36:49 +0200
Newsgroups gmane.text.xml.french.tech
Message-ID <[email protected]>
Seulement les racines ne faisant pas l'objet de liste pose problème. En
l'occurrence les adresses dans l'exemple ci-dessous.

<root>
  <ligne>
    <nom>DUPOND</nom>
    <prenom>Jeanne</prenom>
    <date>01/01/2001</date>
    <adresse>
      <num>125</num>
      <lib>Rue de la république</lib>
      <ville>Paris</ville>
    </adresse>
    <Environnement>
      <enfants>
        <enfant>
          <nom>DUPOND</nom>
          <prenom>Bob</prenom>
        </enfant>
        <enfant>
          <nom>DUPOND</nom>
          <prenom>Rose</prenom>
        </enfant>
      </enfants>
    </Environnement>
  </ligne>
....
</root>

Sinon pour le reste tout m'a l'air correct. Je vais essayer de corriger le
problème restant.

Merci beaucoup.

-----Message d'origine-----
De : [email protected] [mailto:[email protected]] De la part
de COUTHURES Alain
Envoyé : vendredi 6 avril 2007 14:49
À : [email protected]
Objet : [xml-tech] Re: XSL unique pour XML différent

Voici, à essayer, une feuille de style qui gère avec ou sans 
regroupement (elle est peut-être simplifiable...) :
 <xsl:stylesheet version="1.0" txs:name="aplati">
  <xsl:template match="/">
   <html>
    <body>
     <xsl:call-template name="aplati"/>
    </body>
   </html>
  </xsl:template>
  <xsl:template name="aplati">
   <xsl:choose>
    <xsl:when test="count(*[count(*)!=0])!=0 and count(*[count(*)=0])=0">
     <!-- Noeud de regroupement -->
     <xsl:for-each select="*">
      <xsl:call-template name="aplati"/>
     </xsl:for-each>
    </xsl:when>
    <xsl:otherwise>
     <table>
      <tr>
       <xsl:call-template name="groupe"/>
      </tr>
     </table>
    </xsl:otherwise>
   </xsl:choose>
  </xsl:template>
  <xsl:template name="groupe">
   <xsl:for-each select="*[count(*)=0]">
    <!-- Noeud textuel -->
    <td>
     <xsl:value-of select="."/>
    </td>
   </xsl:for-each>
   <xsl:choose>
    <xsl:when test="count(*[count(*)!=0]) &lt; 2">
     <!-- Noeud non textuel tout seul -->
     <xsl:for-each select="*[count(*)!=0]">
      <td>
       <xsl:call-template name="aplati"/>
      </td>
     </xsl:for-each>
    </xsl:when>
    <xsl:otherwise>
     <!-- Noeuds non textuel sans regroupement -->
     <td>
      <table>
       <xsl:for-each select="*[count(*)!=0]">
        <tr>
         <xsl:call-template name="groupe"/>
        </tr>
       </xsl:for-each>
      </table>
     </td>
    </xsl:otherwise>
   </xsl:choose>
  </xsl:template>
 </xsl:stylesheet>

(testé avec TXS (http://sourceforge.net/projects/txs))

Merci de me dire ce que cela donne sur vos autres exemples.

Bien cordialement,

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

Thibaut Gabelle a écrit :
>> Pour résoudre ce problème de noeud de regroupement, il serait possible 
>> de faire une première transformation pour les rajouter là où ils
manquent.
>>     
>
> Effectivement je crois qu'il va falloir que je procède comme ça.
>
>   
>> Plutôt qu'une transformation à part entière, le résultat pourrait être 
>> stocké dans une variable puis relu moyennant une conversion "node-set", 
>> malheureusement dépendante du parseur que vous utilisez... Lequel est-ce
?
>>     
>
> Je vois pas trop où vous voulez en venir avec le parseur.
> J'explique mon environnement : Le fichier XML est construit par des
> composants Java (sans aucun parser particulier, simple écriture dans un
> StringBuffer...), à ce fichier XML j'applique ma transformation XSLT à
> l'aide du transformer Xalan.
> Là j'obtiens ma page résultat HTML, qui selon des actions de l'utilisateur
> (telles que des tris sur de colonnes ou une navigation de page en page)
> rappellera la transformation XSLT avec des paramètres différents.
>
>
> COUTHURES Alain a écrit :
>   
>> Oui, je pense qu'un noeud de regroupement serait mieux, et c'est déjà le 
>> cas pour la racine elle-même dans l'exemple fourni !
>> Alain COUTHURES
>> <agenceXML>
>> http://www.agenceXML.com
>>
>> -
>>   
>> 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)