2010-04-16 15 views
2

Comment supprimer une colonne vide dans le tableau HTML en utilisant XSLT, et avoir quelque chose comme ceci:Comment supprimer une colonne vide dans une table HTML en utilisant XSLT?

 

<table id="cas6"> 
    <tr> 
     <td /> 
     <td> 
     <table> 
      <tr> 
      <td>rechin</td> 
      <td /> 
      </tr> 
      <tr> 
      <td>amarillo</td> 
      <td /> 
      </tr> 
     </table> 
     </td> 
    </tr> 
    </table> 
    <table id="cas7"> 
    <tr> 
     <td>rechin</td> 
     <td /> 
    </tr> 
    <tr> 
     <td>amarillo</td> 
     <td /> 
    </tr> 
    <tr> 
     <td>this shouldn't been</td> 
     <td>deleted</td> 
    </tr> 
    </table> 

Pour supprimer la colonne vide, ceci étant dit pour enlever TD qui sont vides dans tous les tr dans un Xth position

+0

Ceci est ambigu. Les moyens montrent la sortie exacte que vous recherchez. – Tomalak

+0

Dimitre Novatchev a montré la sortie que je recherche. – Monomachus

Répondre

1

Voici une solution très simple:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 

<xsl:template match="node()|@*" name="identity"> 
    <xsl:copy> 
    <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="td[not(node())]"> 
    <xsl:variable name="vPos" select="position()"/> 

    <xsl:if test="../../tr/td[position() = $vPos]/node()"> 
    <xsl:copy-of select="."/> 
    </xsl:if> 
</xsl:template> 
</xsl:stylesheet> 

Lorsque cette transformation est appliquée sur le document XML fourni (fait bien formé):

<html> 
    <table border="1" id="cas6"> 
     <tr> 
      <td/> 
      <td> 
       <table border="1"> 
        <tr> 
         <td>rechin</td> 
         <td /> 
        </tr> 
        <tr> 
         <td>amarillo</td> 
         <td /> 
        </tr> 
       </table></td> 
     </tr> 
    </table> 
    <table border="1" id="cas7"> 
     <tr> 
      <td>rechin</td> 
      <td /> 
     </tr> 
     <tr> 
      <td>amarillo</td> 
      <td /> 
     </tr> 
     <tr> 
      <td>this shouldn't been</td> 
      <td>deleted</td> 
     </tr> 
    </table> 
</html> 

Le résultat correct est voulu produit:

<html> 
    <table border="1" id="cas6"> 
     <tr> 
      <td> 
       <table border="1"> 
        <tr> 
         <td>rechin</td> 
        </tr> 
        <tr> 
         <td>amarillo</td> 
        </tr> 
       </table></td> 
     </tr> 
    </table> 
    <table border="1" id="cas7"> 
     <tr> 
      <td>rechin</td> 
      <td></td> 
     </tr> 
     <tr> 
      <td>amarillo</td> 
      <td></td> 
     </tr> 
     <tr> 
      <td>this shouldn't been</td> 
      <td>deleted</td> 
     </tr> 
    </table> 
</html> 
+0

Oui, assez simple, agréable et propre. J'apprends juste ... – Monomachus

0

Si ma compréhension de la question est correcte, pour une table donnée, si toutes les entrées dans le nième colonne sont vides, vous voulez supprimer cette colonne de la table?

Essayez cette XSLT puis

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="td"> 
     <xsl:variable name="columnNumber" select="position()"/> 
     <xsl:if test="../../tr/td[position()=$columnNumber][* or text()]"> 
     <xsl:copy> 
      <xsl:value-of select="$columnNumber"/> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
     </xsl:if> 
    </xsl:template> 
    <xsl:template match="node()|@*"> 
     <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

Ceci est la transformation « identité », mais quand il correspond à un élément TD, il obtient d'abord le numéro de colonne, puis vérifie si une autre colonne dans d'autres lignes sont vides . S'il trouve des cellules non vides dans la même colonne, il copie l'élément TD, sinon il est ignoré.

+0

 
1rechin 2
1amarillo 2
1this shouldn't been 2deleted
Monomachus

1

Ceci est le XSLT qui a fonctionné pour moi.

 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output omit-xml-declaration="yes" indent="yes"/> 
    <xsl:strip-space elements="*" /> 

    <xsl:template match="node()|@*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="td[not(node())]"> 
    <xsl:variable name="pos" select="position()" /> 
    <xsl:variable name="emptyTds" select="count(../../tr/td[position() = $pos and not(node())])" /> 
    <xsl:variable name="allTds" select="count(../../tr/td[position() = $pos])" /> 
    <xsl:if test="$emptyTds != $allTds"> 
     <xsl:copy> 
     <xsl:value-of select="."/> 
     </xsl:copy> 
    </xsl:if> 
    </xsl:template> 

</xsl:stylesheet> 

+0

La seule solution qui a fonctionné, quand je l'ai testé. – hielsnoppe

Questions connexes