2009-06-10 9 views
10

So che XSLT stessa ha attributi-set, ma che mi costringe a usareC'è qualcosa di simile al CSS incorporato in XSL-FO?

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

ogni volta che voglio uscita un tag

<fo:something> 

. C'è qualcosa nelle specifiche XSL-FO che mi permetterebbe di specificare (diciamo) un insieme predefinito di attributi (margine, riempimento, ecc.) Per tutte le tabelle nell'output FO?

In sostanza sto cercando la funzionalità dei CSS, ma per l'uscita FO invece di HTML.

+0

Vedi https://stackoverflow.com/a/21345708/287948 per la sostituzione vecchia XSL-FO dalle cose più recenti del standard Web ecosistema –

risposta

11

No, non è necessario utilizzare xsl: elemento, l'uso-attributi-set attributo può apparire su elementi di risultato letterali se lo si inserisce nello spazio dei nomi XSLT, in modo da poter usare qualcosa come:

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

Se si vuole avere qualcosa di simile alla funzionalità CSS allora si può aggiungere un altro trasformazione XSLT alla fine della vostra elaborazione che aggiunge gli attributi che si desidera. Si può iniziare con una trasformazione dell'identità ricorsivo e quindi aggiungere i modelli corrispondenti sugli elementi che si desidera modificare, vedere un piccolo esempio di sotto

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

Non come interessati al roba identità ricorsiva in fondo a questa risposta, ma la semplice aggiunta di xsl: use-attribute-sets funziona magnificamente. È possibile aggiungere più riferimenti a set di attributi come in (use-attribute-sets = "attributeSet1 attributeSet2") in modo che, in effetti, funzioni MOLTO COME i CSS! Eccellente! –

0

In XSLT 2.0 c'è anche un'altra opzione. Il seguente modello può essere in un file separato. Devi solo includere questo file nel file xsl originale che genera la struttura 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> 
Problemi correlati