online - xslt generator
XSLT Pasa el contexto actual en la plantilla de llamada (2)
Sería bueno (sería, ¿no?) Si una plantilla sin
xsl:param
y llamada por unacall-template
vacía simplemente recoja el nodo de contexto de la persona que llama.
Así es exactamente cómo se define xsl:call-template
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 esta transformación se aplica en el siguiente documento XML :
<t>
<a/>
</t>
Se produce el resultado deseado, correcto :
Name: a
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 que ese nodo se convierta en el nodo de contexto dentro de la plantilla llamada?
Sería bueno (sería, ¿no?) Si una plantilla sin xsl: param y llamada por una plantilla de llamada vacía simplemente tomara 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>
Solo otra manera de explicar lo que dijo Dimitre.
Cuando llama a una plantilla desde un nodo, ya está allí en ese nodo,
ejemplo:
asume 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 bueno como escribir:
<xsl:template match="MyElement">
<xsl:value-of select="."/>
</xsl:template>
También puede utilizar para cada bucle en la plantilla llamada. :)
Pero solo asegúrate de dónde estás exactamente ..