2012-03-30 12 views
17

En XSLT 1.0, ¿cuál es la forma más corta/limpia/recomendada de pasar el nodo de contexto actual a una plantilla llamada y hacer que ese nodo se convierta en el nodo de contexto dentro de la plantilla llamada?XSLT Pase el contexto actual en la plantilla de llamada

Sería bueno (lo sería, ¿no?) Si una plantilla sin xsl: param y llamada por una plantilla de llamada vacía simplemente seleccionara el nodo de contexto de la persona que llama, pero lo mejor que puedo pensar es esto:

<xsl:call-template name="sub"> 
     <xsl:with-param name="context" select="." /> 
    </xsl:call-template> 

con

<xsl:template name="sub"> 
    <xsl:param name="context" /> 
    <xsl:for-each select="$context"> 

    </xsl:for-each> 
</xsl:template> 

Respuesta

22

sería bueno (que lo haría, ¿verdad?) si una plantilla sin xsl:param y llamado por un vacío call-template simplemente recoger el nodo de contexto de la persona que llama.

Esto es exactamente cómo xsl:call-template se define en la especificación W3C XSLT 1.0 (y 2.0), e implementado por cualquier procesador XSLT compatible.

Aquí hay un pequeño ejemplo:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="text"/> 

<xsl:template match="a"> 
    <xsl:call-template name="currentName"/> 
</xsl:template> 

<xsl:template name="currentName"> 
    Name: <xsl:value-of select="name(.)"/> 
</xsl:template> 
</xsl:stylesheet> 

Cuando se aplica esta transformación en el siguiente documento XML:

<t> 
<a/> 
</t> 

el resultado deseado, correcta se produce:

Name: a 
+0

Gracias Dimitre. No vi esto documentado y no pareció funcionar cuando lo probé. No estaba mirando en el lugar correcto y debo haber estado haciendo algo mal. +1 Q respondió. Aclamaciones. – JPM

+0

@JPM: De nada. Es posible que haya estado mirando la instrucción 'xsl: function' en XSLT 2.0 - es diferente de una plantilla con nombre en que no recibe el contexto de la persona que llama de la función y si la persona que llama tiene que pasar su nodo de contexto como parámetro, si este nodo de contexto debe pasarse. –

4

Simplemente de otra manera, de explicar lo que dijo Dimitre.

Cuando se llama a una plantilla a partir de un nodo, que ya están allí en ese nodo,

ejemplo:

asumen este código:

<xsl:template match="MyElement"> 
    <xsl:call-template name="XYZ"/> 
</xsl:template> 

<xsl:template name="XYZ> 
    <xsl:value-of select="."/> 
</xsl> 

El código anterior es tan buena como la escritura :

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

Puede utilizar para cada bucle en la plantilla llamada también. :)

Pero solo debes estar seguro de dónde estás exactamente ..

Cuestiones relacionadas