Bonjour,
J'ai à ma disposition des données en xml ordonnées en tableaux. Je dois proposer un document html et un document csv contenant les valeurs des tableaux et j'utilise pour cela xslt.
les tableaux sont de la forme <table><tr><td></td></tr></table> comme en html, les td peuvent porter un attribut rowspan ou colspan.
Aucun problème pour l'html, un seul pour le csv : les rowspan.
Je souhaite convertir les rowspan en autant de td dans les tr suivants à la même position que le td en cours d'analyse (peut être dans une feuille xslt intermédiaire) avant de convertir le tout en csv.
un exemple sera plus parlant :
mon tableau original :
Mon tableau transformé (souhaité)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 +---+---+---+ | | 2 | 3 | | 1 +---+---+ | | | | +---+ 4 | 5 | | 6 | | | +---+---+---+
voici comment j'ai traité le cas beaucoup plus simple des colspan :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 +---+---+---+ | 1 | 2 | 3 | +---+---+---+ | 1 | 4 | 5 | +---+---+---+ | 6 | 4 | 5 | +---+---+---+
Ce qui pose le + de souci étant que le nombre de lignes et de colonnes des différents tableaux n'est pas fixe et que je souhaiterais traiter ce cas d'une manière générique : n'importe quel nombre de <td rowspan="x"> par <tr> à n'importe quel endroit de ceux-ci. Il n'y a pas de règle du genre "seule la première case de la ligne peut comporter un rowspan".
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 <xsl:template match="td"> <xsl:variable name="contenu" select="."/> <xsl:variable name="colspan" select="@colspan"/> <xsl:choose> <xsl:when test="$colspan > 0"> <xsl:call-template name="Colspan"> <xsl:with-param name="nombre" select="$colspan"/> <xsl:with-param name="compteur" select="0"/> <xsl:with-param name="valeur" select="$contenu"/> </xsl:call-template> </xsl:when> <xsl:otherwise> <td><xsl:value-of select="normalize-space($contenu)" /></td> </xsl:otherwise> </xsl:choose> </xsl:template> <xsl:template name="Colspan"> <xsl:param name="nombre"/> <xsl:param name="compteur"/> <xsl:param name="valeur"/> <xsl:if test="$compteur < $nombre"> <td><xsl:value-of select="normalize-space($valeur)" /></td> <xsl:call-template name="Colspan"> <xsl:with-param name="nombre" select="number($nombre)"/> <xsl:with-param name="compteur" select="number($compteur)+1"/> <xsl:with-param name="valeur" select="$valeur"/> </xsl:call-template> </xsl:if> </xsl:template>
J'ai essayé de m'expliquer clairement je ne sais si c'est réussi mais y a un joli dessin.
Merci pour votre aide.
Partager