2010-07-13 3 views
2

Je génère une table dans un document pdf en utilisant xml-fo.
Le nombre de colonnes est dynamique. Les colonnes sont uniquement affichées lorsque les tests sont en cours.
Dans les tests, j'utilise des variables comme $ var1, $ var2, ... qui pointent vers des nœuds xml.
xml-fo Table pdf: 'colspan' lorsque le nombre de colonnes est dynamique

J'ai quelque chose comme

<xsl:element name="fo:table-row"> 
    <xsl:element name="fo:table-cell" use-attribute-sets="table-cell"> 
     <xsl:attribute name="number-columns-spanned"> **???** </xsl:element> 
     <xsl:element name="fo:block">Text that spans over columns</xsl:element> 
    </xsl:element> 
</xsl:element> 
<xsl:element name="fo:table-row" use-attribute-sets="headerRow"> 
    <xsl:element name="fo:table-cell" use-attribute-sets="table-cell"> 
     <xsl:element name="fo:block">some value here</xsl:element> 
    </xsl:element> 
    <xsl:if test="$var1"> 
     <xsl:element name="fo:table-cell" use-attribute-sets="table-cell"> 
      <xsl:element name="fo:block">maybe some value here 2</xsl:element> 
     </xsl:element> 
    </xsl:if> 
    <xsl:if test="$var2"> 
     <xsl:element name="fo:table-cell" use-attribute-sets="table-cell"> 
      <xsl:element name="fo:block">maybe some value here 3</xsl:element> 
     </xsl:element> 
    </xsl:if> 
    ... 
</xsl:element> 

J'expansion la 1ère ligne pour couvrir toutes sur les colonnes. "number-columns-spanned" est variable et dépend du nombre de tests qui passent.
Existe-t-il un moyen facile d'extraire dynamiquement le nombre de conditions qui passent afin de définir correctement le nombre d'attribut-colonnes-étendues?

Répondre

3

Vous pouvez compter le contenu des variables en utilisant une expression comme ceci:

count($var1 | $var2 | $var3 | ...) 

C'est en supposant chacune de vos variables est un ensemble peut-être vide. Si vos variables sont des valeurs vraies/fausses plutôt, vous pouvez tirer profit du fait que le faux est vrai et 0 est 1 en XSL (au moins avec l'interprète J'utilise):

$var1 + $var2 + $var3 + ... 

Si les valeurs Aren « ensembles de nœuds t et ne sont pas booléens soit, les convertir en booléens premier:

boolean($var1) + boolean($var2) + boolean($var3) + ... 

pas vraiment une façon très élégante de gérer, mais cela fonctionne.

According to the XPath spec, les booléens sont en effet censés se comporter de cette façon lorsqu'ils sont castés en numérique. Bon à savoir!

Questions connexes