2017-09-25 4 views
0

J'ai besoin de transformer la table html en une autre table html en utilisant XSLT. Mon objectif est de modifier les couleurs de la cellule du tableau en style Zebra. Littéralement, le style Zebra signifie changer la couleur des lignes de table l'une après l'autre.XSLT - Ajouter une valeur d'attribut basée sur le positionnement

Pour les tables simples (il y a une fusion de rangées en place), j'ai utilisé les valeurs de position de rangée de la rangée de table et changé la couleur des rangées positionnées impaires. Le problème survient lorsque la fusion de cellules est en place dans la table. Dans ce cas, je ne peux pas utiliser la valeur des modules de la valeur de position de la ligne, je dois plutôt prendre en compte la valeur de la ligne.

est un exemple ici,

<table> 
    <tbody> 
     <tr> 
      <td rowspan="2">111</td> 
      <td>222</td> 
     </tr> 
     <tr> 
      <td>333</td> 
     </tr> 
     <tr> 
      <td rowspan="4">444</td> 
      <td>555</td> 
     </tr> 
     <tr> 
      <td>666</td> 
     </tr> 
     <tr> 
      <td>777</td> 
     </tr> 
     <tr> 
      <td>888</td> 
     </tr> 
     <tr> 
      <td rowspan="4">999</td> 
      <td>101010</td> 
     </tr> 
     <tr> 
      <td>111111</td> 
     </tr> 
     <tr> 
      <td>121212</td> 
     </tr> 
     <tr> 
      <td>131313</td> 
     </tr> 
     <tr> 
      <td rowspan="5">141414</td> 
      <td>151515</td> 
     </tr> 
     <tr> 
      <td>161616</td> 
     </tr> 
     <tr> 
      <td>171717</td> 
     </tr> 
     <tr> 
      <td>181818</td> 
     </tr> 
     <tr> 
      <td>191919</td> 
     </tr> 
     <tr> 
      <td rowspan="4">202020</td> 
      <td>212121</td> 
     </tr> 
     <tr> 
      <td>222222</td> 
     </tr> 
     <tr> 
      <td>232323</td> 
     </tr> 
     <tr> 
      <td>242424</td> 
     </tr> 
    </tbody> 
</table> 

La sortie attendue devrait ressembler à ceci,

<table> 
    <tbody> 
     <tr> 
      <td rowspan="2" color="shaded">111</td> 
      <td color="shaded">222</td> 
     </tr> 
     <tr> 
      <td color="shaded">333</td> 
     </tr> 
     <tr> 
      <td rowspan="4">444</td> 
      <td>555</td> 
     </tr> 
     <tr> 
      <td>666</td> 
     </tr> 
     <tr> 
      <td>777</td> 
     </tr> 
     <tr> 
      <td>888</td> 
     </tr> 
     <tr> 
      <td rowspan="4" color="shaded">999</td> 
      <td color="shaded">101010</td> 
     </tr> 
     <tr> 
      <td color="shaded">111111</td> 
     </tr> 
     <tr> 
      <td color="shaded">121212</td> 
     </tr> 
     <tr> 
      <td color="shaded">131313</td> 
     </tr> 
     <tr> 
      <td rowspan="5">141414</td> 
      <td>151515</td> 
     </tr> 
     <tr> 
      <td>161616</td> 
     </tr> 
     <tr> 
      <td>171717</td> 
     </tr> 
     <tr> 
      <td>181818</td> 
     </tr> 
     <tr> 
      <td>191919</td> 
     </tr> 
     <tr> 
      <td rowspan="4" color="shaded">202020</td> 
      <td color="shaded">212121</td> 
     </tr> 
     <tr> 
      <td color="shaded">222222</td> 
     </tr> 
     <tr> 
      <td color="shaded">232323</td> 
     </tr> 
     <tr> 
      <td color="shaded">242424</td> 
     </tr> 
    </tbody> 
</table> 

Voici comment la table vue html, avant et après la trasformation,

before

after

J'ai passé quelques semaines à trouver une solution pour cela à partir de XSLT et toujours incapable de trouver un moyen de le faire. Quelqu'un peut-il me suggérer une méthode pour le faire.

+1

et ce que vous avez essayé jusqu'à présent? – Rupesh

Répondre

1

Essayez d'abord regrouper les lignes:

<xsl:variable name="grouped-rows" as="element(rowgroup)*"> 
    <xsl:for-each-group select="td" group-starting-with="td[@rowspan]"> 
    <rowgroup><xsl:copy-of select="current-group()"/></rowgroup> 
    </ 
</ 

itérer puis sur les groupes:

<xsl:for-each select="$grouped-rows"> 
    <xsl:variable name="style" select="if (position() mod 2 = 0) then 'pink' else 'blue'"/> 
    <xsl:for-each select="child::td"> 
    <td class="{$style}"> 
     <xsl:copy-of select="@*, node()"/> 
    </ 
    </ 
</