2009-06-10 16 views
10

sé que sí XSLT tiene atributos conjuntos, pero que las fuerzas que use¿Hay algo "como" CSS integrado en XSL-FO?

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

cada vez que quiero para emitir una etiqueta

<fo:something> 

. ¿Hay algo en la especificación XSL-FO que me permita especificar (digamos) un conjunto predeterminado de atributos (margen, relleno, etc.) para todas las tablas en la salida FO?

Básicamente, estoy buscando la funcionalidad de CSS, pero para salida FO en lugar de HTML.

+0

Ver https://stackoverflow.com/a/21345708/287948 sobre la sustitución de edad XSL-FO por nuevas cosas del ecosistema estándares Web –

Respuesta

11

No, no es necesario que utilice elemento xsl: el uso de atributo conjuntos de atributos puede aparecer en los elementos de resultado literales si se coloca en el espacio de nombres de XSLT, por lo que puede usar algo como:

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

Si desea tener algo cercano a la funcionalidad de CSS, puede agregar otra transformación XSLT al final de su procesamiento que agrega los atributos que desea. Puede comenzar con una transformación de identidad recursivo y luego añadir plantillas a juego en los elementos que desee cambiar, ver un pequeño ejemplo de abajo

<?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

No es tan interesados ​​en la materia recursiva identidad en la parte inferior de esta respuesta, pero la simple adición de xsl: use-attribute-sets funciona muy bien. En realidad, puede agregar varias referencias de conjuntos de atributos como en (use-attribute-sets = "attributeSet1 attributeSet2") para que, de hecho, ¡actúe MUY COMO CSS! ¡Excelente! –

0

En XSLT 2.0 también hay otra opción. La siguiente plantilla puede estar en un archivo separado. Solo necesita incluir este archivo en el archivo xsl original que genera la estructura de 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>