No es demasiado significativo dar a una plantilla un nombre y un modo. El atributo name
identifica completamente una plantilla y no puede haber dos plantillas con el mismo nombre y modos diferentes.
El atributo mode
permite los mismos nodos que deben procesarse más de una vez, utilizando diferentes modos de.
Aquí es un breve ejemplo:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="num[position() mod 3 = 1]">
<tr>
<xsl:apply-templates mode="copy" select=
". | following-sibling::*[not(position() >2)]"/>
</tr>
</xsl:template>
<xsl:template match="*" mode="copy">
<td><xsl:value-of select="."/></td>
</xsl:template>
<xsl:template match="num"/>
</xsl:stylesheet>
Cuando se aplica esta transformación en el siguiente documento XML:
<nums>
<num>01</num>
<num>02</num>
<num>03</num>
<num>04</num>
<num>05</num>
<num>06</num>
<num>07</num>
<num>08</num>
<num>09</num>
<num>10</num>
</nums>
El resultado es que las cifras se muestran en tres tr
(filas), cada una contiene tres columnas (con la posible excepción de la última fila):
<tr>
<td>01</td>
<td>02</td>
<td>03</td>
</tr>
<tr>
<td>04</td>
<td>05</td>
<td>06</td>
</tr>
<tr>
<td>07</td>
<td>08</td>
<td>09</td>
</tr>
<tr>
<td>10</td>
</tr>
En esta transformación, cualquier elemento num
con la posición que no se puede representar en la forma 3*k +1
(donde k
es un número entero), se corresponde con una plantilla con cuerpo vacío y por lo tanto no se procesa.
Sin embargo, queremos procesar todos los num
elementos que deberían formar las celdas de una fila. Por esta purpuse, los estamos procesando mediante la instrucción XSLT:
<xsl:apply-templates mode="copy" select=
". | following-sibling::*[not(position() >2)]"/>
que significa: "No lo aplique en las plantillas de los nodos seleccionados que normalmente serían aplicadas (en ningún modo), sino que se aplican las plantillas que están en copy
el modo"
por lo tanto, no ignore las num
elementos seleccionados, pero ellos están procesando en copy
modo de y están creando las td
s de una fila.
La regla de plantilla:
<xsl:template match="num"/>
es necesario ignorar las plantillas XSLT orden interna (procesamiento por defecto) que de otro modo causar que los valores de cadena de los num
nodos cuya posición no puede ser representado como 3*k +1
, para ser de salida.
Por lo tanto, estos nodos son procesados por ambas plantillas:
<xsl:template match="num"/>
y
<xsl:apply-templates mode="copy" select=
". | following-sibling::*[not(position() >2)]"/>
y así obtener el resultado deseado.
Sería instructivo avanzar con un buen depurador XSLT para ver cómo se aplican estas plantillas.
@ajreal: 1, por ejemplo útil. – Venkat
Buena pregunta, +1. Ver mi respuesta para una explicación y para un ejemplo de código completo. –