2011-12-09 12 views

Respuesta

11

las gracias en un nivel muy básico, se utiliza <xsl:apply-templates> cuando se quiere dejar que los nodos de la manija procesador automáticamente y utiliza <xsl:call-template/> cuando se desea un mayor control sobre el proceso. Así que si usted tiene:

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

Y que tiene la siguiente 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> 

Usted recibirá el resultado WorldHello. Esencialmente, ha dicho "manejar barra y abucheo de esta manera" y luego ha dejado que el procesador XSLT maneje estos nodos a medida que los atraviesa. En la mayoría de los casos, así es como debe hacer las cosas en XSLT.

A veces, sin embargo, quieres hacer algo más elegante. En ese caso, puede crear una plantilla especial que no coincida con ningún nodo en particular. Por ejemplo:

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

Y a continuación, puede llamar a esta plantilla mientras se está procesando <foo> en lugar de procesar automáticamente foo 's nodos hijos:

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

En este ejemplo particular, artificial, que ahora recibe " Hello World "porque ha anulado el procesamiento predeterminado para hacer lo suyo.

Espero que ayude.

+0

Hasta el momento esta es la mejor explicación que he leído nunca en XSLT (aunque tengo que añadir que XSLT es lo mío, y posiblemente nunca más. estarán) –

3

¿Me podría explicar la diferencia entre <xsl:apply-template> y <xsl:call-template> y cuando debo usar <xsl:call-template>?

Uno puede uso <xsl:call-template> pero casi nunca se debe.

Está en el espíritu de XSLT para permitir que el procesador XSLT para determinar exactamente qué plantilla mejores partidos un nodo y para decidir utilizar esta plantilla para el procesamiento de ese nodo. Esto nos proporciona extensibilidad y polimorfismo limpios, fáciles y potentes.

En general, la comparación de xsl:apply-templates a xsl:call-template es similar a la comparación de la invocación de un método virtual de una clase base con la invocación directa de un método no virtual.

Estas son algunas diferencias importantes:

  1. xsl:apply-templates es mucho más rica y más profunda que xsl:call-templates e incluso de xsl:for-each, simplemente porque no sabemos qué código se aplicará en los nodos de selección - en el caso general este código será diferente para nodos diferentes de la lista de nodos.

  2. El código que se aplicará manera se pueden escribirse después de la xsl:apply-templates fue escrito por y personas que no conocen el autor original.

implementación de funciones de orden superior (HOF) en XSLT El FXSL library 's no sería posible si XSLT no tenía la instrucción <xsl:apply-templates>.

Resumen: Las plantillas y la instrucción <xsl:apply-templates> es cómo XSLT implementa y se ocupa de polimorfismo. Uno puede y debe evitar el uso de xsl:call-template, que no permite el polimorfismo y limita la reutilización y la flexibilidad.

Referencia: Ver toda esta discusión: http://www.stylusstudio.com/xsllist/200411/post60540.html

Cuestiones relacionadas