Comment générer une table avec plusieurs colonnes en XSLT?
Eric van der Vlist,
Dyomedea (vdv@dyomedea.com).
mercredi 17 janvier 2001
J'ai un fichier xml contenant :
<elements>
<element>
<nom>NOM1</nom>
<prenom>Prenom1</prenom>
</element>
<element>
<nom>NOM2</nom>
<prenom>Prenom2</prenom>
</element>
<element>
<nom>NOM3</nom>
<prenom>Prenom3</prenom>
</element>
<element>
<nom>NOM4</nom>
<prenom>Prenom4</prenom>
</element>
<element>
<nom>NOM5</nom>
<prenom>Prenom5</prenom>
</element>
</elements>
..... et ainsi de suite.
J'aimerais obtenir une sortie html de type
<table>
<tr>
<td>NOM1 <br/> prenom1</td>
<td>nom2 <br/> prenom2</td>
</tr>
<tr>
<td>NOM3 <br/> prenom3</td>
<td>nom4 <br/> prenom4</td>
</tr>
<tr>
<td>nom n <br /> prenom n </td>
<td> </td>
</tr>
</table>
Comment dois-je faire pour formater mon fichier xml en colonnes ?
C'est une bonne question qui permet de se frotter à plusieurs petits pièges XSLT...
Il faut en effet définir un traitement particulier pour les premiers éléments qui seront insérés dans chaque ligne pour qu'ils créent cette ligne et déclenchent les templates correspondant aux différentes colonnes.
C'est donc l'occasion d'utiliser l'axe "following-siblings" et d'utiliser l'opérateur XPath "mod"…
La feuille de style suivante produit le résultat demandé:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" version="1.0" encoding="ISO-8859-1"
indent="yes"/>
<xsl:template match="/">
<html>
<body>
<table>
<xsl:apply-templates select="elements/element" mode="premiers"/>
</table>
</body>
</html>
</xsl:template>
<xsl:template match="element[(position() mod 2) = 1]" mode="premiers">
<tr>
<xsl:apply-templates select="."/>
<xsl:choose>
<xsl:when test="following-sibling::element[1]">
<xsl:apply-templates select="following-sibling::element[1]"/>
</xsl:when>
<xsl:otherwise>
<td> </td>
</xsl:otherwise>
</xsl:choose>
</tr>
</xsl:template>
<xsl:template match="element" mode="premiers"/>
<xsl:template match="element">
<td>
<xsl:value-of select="nom"/>
<br/>
<xsl:value-of select="prenom"/>
</td>
</xsl:template>
</xsl:stylesheet>
JA: "[xml-tech]"Eric van der Vlist: "[xml-tech] Re: Tables"Eric van der Vlist: "[xml-tech] Re: Tables"
Copyright 2001,
Eric van der Vlist.
|