2010-03-16 8 views
0

Pour chaque tableau d'un document, je voudrais le définir "simple" ou "compliqué". Il devrait être "simple" si chaque ligne contient au plus deux colonnes, sinon cela devrait être "compliqué".XSLT: Nombre total de colonnes du tableau

Comment est-ce que je peux faire ceci avec xslt?

+2

Montrez-nous votre XML, il est difficile de comprendre ce que vous avez besoin de faire avec le XSLT. –

+0

Désolé. Ceci est une table commune ressemble à du balisage HTML avec un nombre arbitraire de cellules dans chaque ligne. – Kalinin

Répondre

1

Je suis désolé que vous ayez pris le temps. Je suis venu avec une solution. Voici la réponse, si quelqu'un a besoin.

<xsl:template match="TABLE"> 
<xsl:variable name="tableClass"> 
    <xsl:choose> 
     <xsl:when test="count(TBODY/TR[count(child::*) = 2]) = count(TBODY/TR)"> 
      simple 
     </xsl:when> 
     <xsl:otherwise> 
      complicated 
     </xsl:otherwise> 
    </xsl:choose> 
</xsl:variable> 
<table class="{$tableClass}"> 
    <xsl:apply-templates select="CAPTION"/> 
    <xsl:apply-templates select="TBODY"/> 
    and so on....... 
</table> 

+1

'' – Tomalak

+0

Je suis désolé, mais votre proposition ne correspond pas, le nombre de colonnes doit être égal à 2, au lieu de <= 2. Mais tous les détails. Je vous remercie. – Kalinin

0

Compte tenu de deux documents XML, A:

<base> 
    <row> 
    <col1 value='x'/> 
    <col2/> 
    </row> 
    <row> 
    <col1 value='y'/> 
    <col2/> 
    </row> 
    <row> 
    <col1 value='z'/> 
    <col2/> 
    </row> 
</base> 

et B:

<base> 
    <row> 
    <col1/> 
    <col2/> 
    <col3/> 
    </row> 

    <row> 
    <col1/> 
    <col2/> 
    </row> 
</base> 

ce xsl dira si elle est "simple" ou "complexe" basé sur le nombre d'éléments enfants sous chaque élément de ligne de niveau supérieur:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="text" encoding = "iso-8859-1"/> 

    <!-- is the xml simple? --> 
    <!-- simple, in this case, means each row has 2 or fewer columns --> 


    <xsl:variable name="maxColCount"> 
    <xsl:for-each select="//base/row"> 
     <xsl:sort data-type="number" order="descending"/> 
     <xsl:if test="position()=1"><xsl:value-of select="count(./*)"/></xsl:if> 
    </xsl:for-each> 
    </xsl:variable> 


    <xsl:template match="/"> 
    <xsl:choose> 
     <xsl:when test="$maxColCount > 2">complex</xsl:when> 
     <xsl:otherwise>simple</xsl:otherwise> 
    </xsl:choose> 
    </xsl:template> 

</xsl:stylesheet> 

Le résultat est: A est simple et B est complexe.

+0

Vous avez oublié d'ajouter select = "count (./*)" à votre chaîne . Sans cela, le tri ne fonctionne pas. – Kalinin