2013-09-27 10 views
6

esempio semplificato:XSLT - Esiste un modo per aggiungere attributi aggiunti con <xsl: attribute>?

<xsl:template name="helper"> 
    <xsl:attribute name="myattr">first calculated value</xsl:attribute> 
</xsl:template> 

<xsl:template match="/> 
    <myelem> 
    <xsl:call-template name="helper" /> 
    <xsl:attribute name="myattr">second calculated value</xsl:attribute> 
    </myelem> 
</xsl:template> 

C'è qualche modo per il secondo per accodare il secondo valore calcolato per lo stesso attributo myattr nel nodo risultato?

Ho visto che è possibile utilizzare un modello di valore di attributo se l'attributo di destinazione si trova nell'xml di origine, ma posso fare riferimento in qualche modo al valore dell'attributo che ho precedentemente aggiunto al nodo risultato?

Grazie in anticipo!

risposta

4

Un approccio che è possibile adottare è aggiungere un parametro al modello di supporto, che si aggiunge al valore dell'attributo.

<xsl:template name="helper"> 
    <xsl:param name="extra" /> 
    <xsl:attribute name="myattr">first calculated value<xsl:value-of select="$extra" /></xsl:attribute> 
</xsl:template> 

allora si può solo passato in secondo valore calcolare come parametro

<xsl:template match="/> 
    <myelem> 
    <xsl:call-template name="helper"> 
     <xsl:with-param name="extra">second calculated value</xsl:with-param> 
    </xsl:call-template> 
    </myelem> 
</xsl:template> 

Non è necessario impostare il parametro con ogni chiamata però. Se non vuoi aggiungere alcun elemento, chiama il modello helper senza parametri e non aggiungerà nulla al primo valore calcolato.

+0

Ottima idea! Un'ulteriore domanda però: posso aggiungere più parametri al template 'helper', e potenzialmente usare più' 'elementi nella chiamata? –

+0

(Risposta alla mia stessa domanda :) Sì, è possibile utilizzare più parametri. –

0

Prova questo:

<xsl:template name="helper"> 
    <xsl:attribute name="myattr">first calculated value</xsl:attribute> 
    </xsl:template> 
    <xsl:template match="/"> 
    <myelem> 
     <xsl:call-template name="helper" /> 
     <xsl:variable name="temp" select="@myattr"/> 
     <xsl:attribute name="myattr"> 
     <xsl:value-of select="concat($temp, 'second calculated value')" /> 
     </xsl:attribute> 
    </myelem> 
    </xsl:template> 
+3

Che non funziona: 'select =" @ myattr "' cercherà nel nodo di contesto dell'albero di input, non nell'albero di output. In questo caso quel nodo è il nodo radice del documento ('/') che non può mai avere attributi. –

2

L'approccio più semplice sarebbe quella di cambiare la nidificazione un po '- avere la helper appena generare nodi di testo e mettere il <xsl:attribute> nel modello di chiamata:

<xsl:template name="helper"> 
    <xsl:text>first calculated value</xsl:text> 
</xsl:template> 

<xsl:template match="/> 
    <myelem> 
    <xsl:attribute name="myattr"> 
     <xsl:call-template name="helper" /> 
     <xsl:text>second calculated value</xsl:text> 
    </xsl:attribute> 
    </myelem> 
</xsl:template> 

Questo imposta myattr su "primo valore calcolato calcolato valore calcolato" - se si desidera uno spazio tra "valore" e "secondo", è necessario includere quello all'interno di uno degli elementi <xsl:text>

 <xsl:text> second calculated value</xsl:text> 
+0

Questa è una buona risposta, anche se nel caso reale il modello 'helper' aggiunge molti altri attributi, e nel nodo' 'può o non può modificare' mioattr' in base a determinati calcoli. Quindi, bella idea ma non comoda nel mio caso. –

0

Mentre è più o meno la stessa cosa, preferirei il modo più conciso di creare una variabile anziché avere un modello di supporto. Si noti che è ancora possibile chiamare un modello all'interno di xsl: variabile per il caso più complicato.

<xsl:template match="/"> 
    <myelem> 
    <xsl:variable name="first">first calculated value </xsl:variable > 
    <xsl:attribute name="myattr"> 
     <xsl:value-of select="concat($first, 'second calculated value')"/> 
    </xsl:attribute> 
    </myelem> 
</xsl:template> 
Problemi correlati