2010-06-08 16 views
5

Abbiamo un nodo xml "elemento" con un attributo "stile", che è "Intestazione1". Questo stile può tuttavia cambiare. Abbiamo un insieme di attributi denominato Header1 che definisce come dovrebbe apparire in un PDF, generato tramite xsl: fo.Come posso combinare xsl: attribute e xsl: use-attribute-sets per utilizzare in modo condizionale un set di attributi?

questo funziona (l'uso-attributo-set è menzionato in linea, nel fo: nodo table-cell):

ma questo non (utilizzando xsl: attributo, perché l'attributo @style può anche essere Header2 per esempio). Non genera un errore, il PDF viene creato, ma gli attributi non vengono applicati.

<xsl:template match="item[@type='label']"> 
    <fo:table-row> 
     <fo:table-cell>   
      <xsl:attribute name="xsl:use-attribute-sets"> 
       <xsl:value-of select="@style" /> 
      </xsl:attribute> 
      <fo:block> 
       <fo:inline font-size="8pt" > 
        <xsl:value-of select="." /> 
       </fo:inline> 
      </fo:block> 
     </fo:table-cell> 
    </fo:table-row> 
</xsl:template> 

Qualcuno sa perché? E come possiamo ottenere questo, preferibilmente senza xsl lungo: if o xsl: quando roba?

risposta

5

Da http://www.w3.org/TR/xslt#attribute-sets

insiemi Abilità sono utilizzati specificando un uso a attributo-set attributo xsl: elemento xsl: copy [...] o xsl: elementi di attributo-set

Da http://www.w3.org/TR/xslt#section-Creating-Elements-with-xsl:element

<!-- Category: instruction --> 
<xsl:element 
    name = { qname } 
    namespace = { uri-reference } 
    use-attribute-sets = qnames> 
    <!-- Content: template --> 
</xsl:element> 

E http://www.w3.org/TR/xslt#copying

<!-- Category: instruction --> 
<xsl:copy 
    use-attribute-sets = qnames> 
    <!-- Content: template --> 
</xsl:copy> 

Quindi, è chiaro che non può essere un AVT (definito in modo dinamico).

Nota: elemento risultato proposito letterale, la specifica dicono: set attributo può essere utilizzato anche specificando un xsl: uso-attributo-set attributo su un elemento di risultato letterale. È raro che vaga consentendo l'AVT. Assume no.

Circa secondo esempio: con quel modello si sta aggiungendo un attributo "xsl: use-attribute-sets" nella struttura dei risultati. Non è iterprinter dal processore XSLT.

Quindi, qual è la soluzione? Devi sbarazzarti di "xsl: use-attribute-sets". Applicare una regola modello per "@style" e generare lì gli attributi desiderati.

0

Prova:

<fo:table-cell xsl:use-attribute-sets="{@style}"> 
+0

No, non funzionerà. Otteniamo il seguente errore: "Il carattere '{', valore esadecimale 0x7B, non può essere incluso in un nome". – Peter

0

utilizzare una variabile per definire style, una variabile per true, una variabile per false, e una variabile per fare riferimento a uno dei due dinamicamente utilizzando concatenazione della stringa:

<xsl:variable name="style"> 
    <xsl:value-of select="concat(boolean(@style),boolean(not(@style)))"/> 
</xsl:variable> 

<xsl:variable name="falsetrue" select="'foo'"/> 
<xsl:variable name="truefalse" select="'bar'"/> 
<!--...--> 


<xsl:value-of select="//xsl:variable/@select[../@name='style']"/> 

Oppure puoi far corrispondere i modelli e chiamarli utilizzando il valore di "stile":

<xsl:template name="Header1" match="xsl:template[@name='Header1']"/> 

<xsl:template name="Header2" match="xsl:template[@name='Header2']"/>