2011-12-09 37 views

risposta

11

ringrazio a un livello molto elementare, si utilizza <xsl:apply-templates> quando si vuole lasciare automaticamente i nodi maniglia del processore, e si utilizza <xsl:call-template/> quando si desidera un maggior controllo sul processo. Quindi, se avete:

<foo> 
    <boo>World</boo> 
    <bar>Hello</bar> 
</foo> 

e si ha la seguente XSLT:

<xsl:template match="foo"> 
    <xsl:apply-templates/> 
</xsl:template> 

<xsl:template match="bar"> 
    <xsl:value-of select="."/> 
</xsl:template> 

<xsl:template match="boo"> 
    <xsl:value-of select="."/> 
</xsl:template> 

Si otterrà il risultato WorldHello. In sostanza, hai detto "handle bar and boo in questo modo" e poi hai lasciato che il processore XSLT gestisse questi nodi mentre li incontrava. Nella maggior parte dei casi, è così che dovresti fare le cose in XSLT.

A volte, però, si vuole fare qualcosa di più elaborato. In tal caso, puoi creare un modello speciale che non corrisponde ad alcun nodo particolare. Per esempio:

<xsl:template name="print-hello-world"> 
    <xsl:value-of select="concat(bar, ' ' , boo)" /> 
</xsl:template> 

E si può quindi chiamare questo modello, mentre si sta elaborazione <foo> piuttosto che elaborare automaticamente foo 's nodi figlio:

<xsl:template match="foo"> 
    <xsl:call-template name="print-hello-world"/> 
</xsl:template> 

In questo particolare esempio artificiale, è ora ottenere " Hello World "perché hai sovrascritto l'elaborazione predefinita per fare le tue cose.

Spero che questo aiuti.

+0

Finora questo è la migliore spiegazione che io abbia mai letto su XSLT (anche se devo aggiungere che XSLT non è il mio genere, e forse mai. sarà) –

3

Vi prego di spiegare la differenza tra <xsl:apply-template> e <xsl:call-template> e quando dovrei usare <xsl:call-template>?

Uno può uso <xsl:call-template> ma quasi mai dovrebbe.

E 'nello spirito di XSLT per consentire al processore XSLT per determinare esattamente quale template migliori partite un nodo e per decidere di utilizzare questo modello per l'elaborazione di quel nodo. Questo ci dà estensibilità e polimorfismo puliti, facili e potenti.

In generale, confrontando xsl:apply-templates a xsl:call-template è simile a confrontare l'invocazione di un metodo virtuale da una classe base a quella di chiamare direttamente un metodo non virtuale.

Qui sono alcune importanti differenze:

  1. xsl:apply-templates è molto più ricco e più profondo di xsl:call-templates e anche da xsl:for-each, semplicemente perché non sappiamo quale codice sarà applicato sui nodi di la selezione - nel caso generale questo codice sarà diverso per nodi diversi della lista di nodi.

  2. Il codice che verrà applicato si può scrivere via dopo la xsl:apply-templates è stato scritto e le persone che non conoscono l'autore originale.

attuazione s' La FXSL library di funzioni di ordine superiore (HOF) in XSLT non sarebbe possibile se XSLT non aveva l'istruzione <xsl:apply-templates>.

Sommario: I modelli e l'istruzione <xsl:apply-templates> sono il modo in cui XSLT implementa e si occupa del polimorfismo. Si può e si dovrebbe evitare di usare xsl:call-template, che non consente il polimorfismo e limita la riusabilità e la flessibilità.

Riferimento: Vedere tutta questa discussione: http://www.stylusstudio.com/xsllist/200411/post60540.html

Problemi correlati