2009-06-10 13 views
10

Je sais que XSLT a lui-même attribute-sets, mais qui me oblige à utiliserY a-t-il quelque chose de «semblable» à la CSS dans XSL-FO?

<xsl:element name="fo:something"> 

chaque fois que je veux sortir un

<fo:something> 
tag

. Y at-il quelque chose dans la spécification XSL-FO qui me permettrait de spécifier (disons) un ensemble d'attributs par défaut (marge, remplissage, etc.) pour toutes les tables dans la sortie FO? Essentiellement, je suis à la recherche de la fonctionnalité de CSS, mais pour la sortie FO au lieu de HTML.

+0

Voir https://stackoverflow.com/a/21345708/287948 sur le remplacement de vieux XSL-FO par les nouvelles choses de normes Web écosystème –

Répondre

11

Non, vous n'êtes pas obligé d'utiliser xsl: élément, l'utilisation-attribute-sets peuvent apparaître sur les éléments de résultat littéral si vous le placez dans l'espace de noms XSLT, de sorte que vous pouvez utiliser quelque chose comme:

<fo:something xsl:use-attribute-sets="myAttributeSet"> 

Si vous voulez avoir quelque chose près de la fonctionnalité CSS, vous pouvez ajouter une autre transformation XSLT à la fin de votre traitement qui ajoute les attributs que vous voulez. Vous pouvez commencer par une transformation d'identité récursive puis ajouter des modèles correspondant aux éléments que vous souhaitez modifier, voir un petit exemple ci-dessous

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:attribute-set name="commonAttributes"> 
    <xsl:attribute name="common">value</xsl:attribute> 
    </xsl:attribute-set> 
    <xsl:template match="node() | @*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node() | @*"/> 
    </xsl:copy> 
    </xsl:template> 
    <xsl:template match="someElement"> 
    <xsl:copy use-attribute-sets="commonAttributes"> 
     <xsl:attribute name="someAttribute">someValue</xsl:attribute> 
     <xsl:apply-templates select="node() | @*"/> 
    </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 
+0

pas aussi intéressés à l'étoffe d'identité récursive au bas de cette réponse, mais la simple addition de xsl: use-attribute-sets fonctionne à merveille. Vous pouvez réellement ajouter plusieurs références d'ensemble d'attributs comme dans (use-attribute-sets = "attributeSet1 attributeSet2") de sorte que, en fait, il agit TRÈS BEAUCOUP COMME CSS! Excellent! –

0

Dans XSLT 2.0 il y a aussi une autre option. Le modèle suivant peut être dans un fichier séparé. Vous devez uniquement inclure ce fichier dans le fichier xsl d'origine qui génère la structure FO.

<xsl:transform 
    version="2.0" 
    xmlns:fo="http://www.w3.org/1999/XSL/Format" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:template match="/" priority="1000"> 
     <!-- Store generated xsl-fo document in variable--> 
     <xsl:variable name="xsl-fo-document"> 
      <xsl:next-match/> 
     </xsl:variable> 

     <!-- Copy everything to result document and apply "css" --> 
     <xsl:apply-templates select="$xsl-fo-document" mode="css"/> 
    </xsl:template> 

    <xsl:template match="@*|node()" priority="1000" mode="css"> 
     <xsl:param name="copy" select="true()" tunnel="yes"/> 
     <xsl:if test="$copy"> 
      <xsl:copy> 
       <xsl:next-match> 
        <xsl:with-param name="copy" select="false()" tunnel="yes"/> 
       </xsl:next-match> 
       <xsl:apply-templates select="@*|node()" mode="css"/> 
      </xsl:copy> 
      </xsl:if> 
    </xsl:template> 

    <!-- **************************** --> 
    <!-- CSS Examples (e.g. fo:table) --> 
    <!-- **************************** --> 

    <xsl:template match="fo:table-cell[not(@padding)]" mode="css"> 
     <xsl:attribute name="padding" select="'2pt'"/> 
     <xsl:next-match/> 
    </xsl:template> 

    <xsl:template match="fo:table-header/fo:table-row/fo:table-cell" mode="css"> 
     <xsl:attribute name="color" select="'black'"/> 
     <xsl:attribute name="font-style" select="'bold'"/> 
     <xsl:next-match/> 
    </xsl:template> 

</xsl:transform>