2010-12-20 4 views
60

En¿Puede uno darme el ejemplo de "modo" de plantilla en xsl?

<xsl:template name="temp_name" mode="mode"> 

¿Cuál es el significado de mode? Busqué muchos recursos, pero no pude encontrar un ejemplo para eso. Entonces, ¿alguien puede explicar con un ejemplo? Gracias por adelantado.

+0

@ajreal: 1, por ejemplo útil. – Venkat

+0

Buena pregunta, +1. Ver mi respuesta para una explicación y para un ejemplo de código completo. –

Respuesta

71

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.

+1

buen ejemplo, fácil de entender en el paso a paso, muchas gracias. – Venkat

+0

Excelente, nunca entendí modos antes de leer tu respuesta. Ojalá pudiera votar dos veces por eso. –

+0

Realmente un ejemplo excelente, requisito muy similar Tengo que formatear datos en un grupo de 3 columnas por fila. – Shaggy

4

En términos orientados a objetos (OO), xsl: apply-templates es como una función que itera sobre una lista de objetos (nodos) y, para cada objeto, llama a la misma función polimórfica. Cada regla de plantilla en su hoja de estilo define una implementación diferente de esa única función polimórfica. La implementación elegida depende de las características de tiempo de ejecución del objeto (nodo). Reforzando la analogía de OO, un nombre de modo identifica qué función polimórfica ejecutar repetidamente en una llamada a xsl: apply-templates.

<xsl:apply-templates select="phone" /> 
<xsl:apply-templates select="phone" mode="accountNumber"/> 
<xsl:template match="phone"> 
     <TD>A</TD> 
</xsl:template> 
<xsl:template match="phone" mode="accountNumber"> 
     <TD>B</TD> 
</xsl:template> 

Enlace un ejemplo sencillo aquí: https://msdn.microsoft.com/en-us/library/ms256045%28v=vs.110%29.aspx

+0

Esta es una respuesta que es principalmente información copiada y pegada de la Guía de bolsillo XSLT. El OP pidió que alguien lo explicara con ejemplos ... –

+0

La plantilla como una función, el ejemplo aquí muestra de forma concisa la función polimórfica tipo OO llamada "teléfono". puedes dar un modo diferente para llamar a un teléfono diferente. –

Cuestiones relacionadas