Re: XSL unique pour XML différent
COUTHURES Alain <[email protected]> Fri, 06 Apr 2007 14:49:17 +0200
| Newsgroups | gmane.text.xml.french.tech |
|---|---|
| Message-ID | <[email protected]> |
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]) < 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)
>
>
>