2010-02-24 4 views
6

J'utilise une feuille de style XSLT (par Antennahouse) pour convertir XHTML en un fichier XSL-FO. J'ai défini une ligne vide dans mon fichier XHTML comme 2 balises HTML consécutives. Maintenant, il n'y a pas de support natif pour une ligne vide dans le format XSL-FO. Je veux contourner cette limitation en ajoutant une hauteur au bloc fo: block que la feuille de style insère pour une balise BR. Cependant, je suis nouveau dans le langage XSLT et j'ai quelques problèmes à le faire. Je peux trouver comment insérer cette hauteur pour chaque balise BR que je rencontre, mais je veux seulement que la ligne vide soit insérée quand il y a 2 balises BR l'une après l'autre (sinon une ligne vide serait insérée après chaque texte suivi par une balise BR.)en utilisant xslt stylesheet pour convertir des lignes vides xhtml en une ligne vide XSL-FO

Je suis arrivé à faire une expression 'non-sens' (11 est supérieure à 10) qui définira quand insérer un bloc fo: normal ou un bloc fo: avec espace-après = "1em". Évidemment, cette expression n'a aucun sens, ce qu'il faut vérifier, c'est si cet élément BR est le deuxième d'affilée. Si quelqu'un pouvait m'aider ici ou me diriger dans la bonne direction, ce serait grandement apprécié. C'est ce que j'ai en ce moment:

<xsl:template match="html:br"> 
<xsl:choose> 
    <xsl:when test="11 &gt; 10"> 
     <fo:block space-after="1em"> 
      <xsl:call-template name="process-common-attributes"/> 
     </fo:block> 
    </xsl:when> 
    <xsl:otherwise> 
     <fo:block> 
      <xsl:call-template name="process-common-attributes"/> 
     </fo:block> 
    </xsl:otherwise> 
    </xsl:choose> 

Pour des raisons de référence, ceci est un morceau de XHTML où je veux que les balises doubles BR à se transformer en une ligne vide, mais les balises simples BR devrait simplement être un saut de ligne régulier.

    <div style="color: #000000; font-family: arial; font-size: 10pt; font-style: normal; font-weight: normal;"> 
        <span>description</span> 
        <br/> 
        <span>using</span> 
        <br/> 
        <span>multiple</span> 
        <br/> 
        <span>lines</span> 
        <br/> 
        <br/> 
        <span>with</span> 
        <br/> 
        <br/> 
        <span>blank</span> 
        <br/> 
        <br/> 
        <span>lines</span> 
        <br/> 
       </div> 

Répondre

4

Quelque chose dans le genre de ceci.

match que les <br> s qui sont directement suivi par un élément (following-sibling::*[1]) qui est lui-même un <br> ([self::html:br]):

<xsl:template match="html:br[following-sibling::*[1][self::html:br]]"> 
    <fo:block space-after="1em" /> 
</xsl:template> 

et jeter les <br> s qui sont directement précédés d'un <br>, à éviter de doubler l'espace après. En les faisant correspondre avec un modèle vide, ils sont effectivement supprimés:

<xsl:template match="html:br[preceding-sibling::*[1][self::html:br]]" /> 
+0

Excellent, cela a fonctionné instantanément. Je vous remercie! –

+0

@Bas: Vous êtes les bienvenus. :) Bonne question, BTW. – Tomalak

0

Je jouais avec la même idée de sauts de ligne multiples.

<xsl:template match="html:br"> 
    <fo:block linefeed-treatment="preserve"> 
    <xsl:text>&#10;</xsl:text> 
    </fo:block> 
</xsl:template> 
Questions connexes