xsl when template for ejemplo content templates xslt foreach

templates - when - xslt template



¿Diferencias entre for-each y templates en xsl? (7)

Tanto ''for-each'' como ''template'' se usan para recuperar los nodos de xml en xsl. Pero ¿cuál es la diferencia entre ellos en básicamente

Estas son algunas de las diferencias más importantes :

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

  2. El código que se aplicará puede escribirse después de que xsl:apply template s fue escrito y por personas que no conocen al autor original.

La implementación de la biblioteca FXSL de funciones de orden superior (HOF) en XSLT no sería posible si XSLT no tuviera la instrucción <xsl:apply-templates> .

Resumen : Las plantillas y la instrucción <xsl:apply-templates> es la forma en que XSLT implementa y trata el polimorfismo.

Referencia : Ver todo este hilo: http://www.stylusstudio.com/xsllist/200411/post60540.html

Tanto xsl:for-each como xsl:template se utilizan para recuperar nodos de xml en una hoja de estilo xsl. ¿Pero cuál es la diferencia fundamental entre ellos? Por favor guíame. Gracias por adelantado.


Creo que esto tiene algo que ver con la comprensión del procesamiento del estilo push vs. pull que simplemente comparando xsl:for-each o xsl:template match="..." . Con frecuencia, los programadores de otra disciplina utilizan una gran cantidad de xsl:if , xsl:choose y for-loops cuando el problema podría haberse resuelto de una forma XSLTish más elegante.

Pero a la pregunta: en mi opinión , si considera usar xsl:for-each lugar de procesar los datos con xsl:apply-templates , debe volver a pensarlo. Hay casos en los que un for-loop es adecuado en XSLT, pero siempre que una plantilla coincidente haga lo mismo, las plantillas son el camino a seguir. En mi experiencia, por lo general, puede hacer la mayoría de xsl:for-each con un xsl:apply-templates lugar.

Algunos de los beneficios que veo al usar plantillas coincidentes en un bucle for son:

  • Las hojas de estilo son más fáciles de mantener y extender, especialmente si los datos de origen cambian.
  • Como lo menciona @chiborg, las plantillas se pueden reutilizar ya que no están integradas en una plantilla específica. Junto con xsl:next-match en XSLT 2.0, puede encadenar plantillas de manera poderosa.
  • No tiene que imitar el comportamiento ya incorporado en todos los procesadores XSLT, es decir; use xsl:apply-templates y deje que el procesador trabaje por usted.
  • Además, me resulta más fácil entender y depurar una hoja de estilo de estilo de inserción. Si divide las plantillas pequeñas de información de la hoja de estilo que hacen una o varias cosas y escribe patrones coincidentes específicos, es fácil ver qué plantilla está haciendo qué y rastrea la fuente del problema.

Estos son para completar diferentes instrucciones XSLT.

Más que el estilo de empujar contra tirar, esto es más como iteración contra recursión.

xsl:for-each es una instrucción de iterador con todos los beneficios y restricciones de iteración en un paradigma declarativo sin estado: un buen procesador no debe contaminar la pila de llamadas.

xsl:apply-templates es una instrucción de recursión general. General en el sentido de que es más potente que xsl:call-template : "lanza" los nodos seleccionados al mecanismo de coincidencia de patrones, una verdadera "invocación de función dinámica".


Generalmente estoy de acuerdo con las otras respuestas, pero diré que, en mi experiencia, una hoja de estilo escrita con xsl:for-each puede ser mucho más fácil de leer, entender y mantener que una que se basa en gran medida en xsl:apply-templates . . Especialmente xsl:apply-templates con una selección implícita (o una selección muy genérica como select="node()" ).

¿Por qué? Porque es muy fácil ver lo que hará una por cada uno. Con las plantillas de aplicación, en esencia, debe (a) conocer todas las entradas XML posibles (lo que será más fácil si tiene un esquema, pero aún así tiene que resumir el esquema y muchas veces no tiene un esquema). especialmente para los datos XML intermedios transitorios enviados en una etapa de una canalización, e incluso si tiene un esquema, es posible que su marco de desarrollo (como un ESB o CMS) no le brinde una manera de validar su XML en cada punto de sus tuberías. Por lo tanto, si los datos no válidos se arrastran, no se le notificará de inmediato, así podrá predecir qué tipos de nodos se seleccionarán (por ejemplo, hijos del nodo de contexto); y (b) observe cada plantilla en la hoja de estilo para ver qué plantilla coincide con los nodos con mayor prioridad (y el último en el orden de los documentos). El orden de procesamiento también puede omitir todos los archivos o diferentes archivos (importados o incluidos). Esto puede hacer que sea muy difícil "ver" lo que está pasando.

Mientras que con un para cada uno, usted sabe exactamente qué código se instanciará: el código dentro del para cada uno. Y dado que para cada uno requiere una expresión de selección explícita, es más probable que tenga un campo más estrecho para adivinar sobre qué nodos se pueden hacer coincidir.

Ahora no niego que las plantillas de aplicación sean mucho más poderosas y flexibles que para cada una. Ese es exactamente el punto: las construcciones que son más potentes y flexibles, también son más difíciles de restringir, comprender y depurar (y evitan los agujeros de seguridad). Es la Regla de la potencia mínima : "Los lenguajes poderosos (o en este caso, las construcciones) inhiben la reutilización de la información". ( También discutido aquí ).

Cuando utiliza las plantillas de aplicación, cada plantilla es más modular y, por lo tanto, más reutilizable en sí misma, pero la hoja de estilo es más compleja y la interacción entre las plantillas es menos predecible. Cuando se usa para cada uno, el flujo de procesamiento es fácil de predecir y ver.

Con <xsl:apply-templates /> , (o con <xsl:for-each select="node()"/> ), cuando la estructura del XML de entrada cambia, el comportamiento de la hoja de estilo cambia, sin la revisión del desarrollador. Si esto es bueno o malo, depende de cuánta previsión haya puesto en su hoja de estilo y cuánta buena comunicación haya entre el desarrollador del esquema XML y el desarrollador de la hoja de estilo (que puede ser la misma persona o puede pertenecer a diferentes organizaciones).

Así que para mí, es una decisión de juicio. Si tiene XML orientado a documentos, como HTML, donde muchos de los tipos de elementos realmente pueden tener muchos tipos diferentes de elementos secundarios, en una jerarquía de profundidad arbitraria, y el procesamiento de un tipo de elemento dado no depende muy a menudo de su contexto , entonces aplicar plantillas es absolutamente esencial. Por otro lado, si tiene XML "orientado a datos", con una estructura predecible, donde no suele tener el mismo tipo de elemento que significa lo mismo en diferentes contextos, ya que cada uno puede ser mucho más sencillo de leer y depurar (y por lo tanto escribir correctamente y rápidamente).


Realmente no importa, pero es posible que desee pensarlo para el siguiente pulgar de las reglas que encontré:

  • Si el código depende de la posición de contexto (posición ()), póngalo en un <xsl:for-each> .
  • Si el código depende del nodo de contexto (. O cualquier ruta de ubicación), colóquelo en una plantilla coincidente.
  • De lo contrario, utilice una plantilla con nombre.

Consulte y lea más en: http://www.jenitennison.com/blog/node/9


Un uso de for-each que no he visto mencionado: puede usarlo para cambiar el nodo de contexto a otro documento. Lo he usado para transformar datos XML en un formulario de entrada HTML. La plantilla que coincidía con un campo de datos contenía un para-cada que seleccionaba un solo nodo: el xs:element en el XSD que describía el campo de datos para transformar.

Al usar la descripción en el XSD, un campo de datos podría transformarse en un grupo de botones de opción, un cuadro desplegable o una entrada de texto simple y sin formato. Sin for-each no podía caminar a través de los dos documentos al mismo tiempo.

En general, prefiero emparejar plantillas. Encuentro que corresponde a la noción de una sola transformación aplicada al mismo tiempo que para cada nodo, luego la siguiente, luego la siguiente, etc. Pero esa es una preferencia personal, por supuesto.


for-each solo se puede utilizar dentro de un lugar en su plantilla. Las plantillas se pueden reutilizar con diferentes llamadas de apply-templates . Principalmente utilizo plantillas en lugar de para cada uno debido a la flexibilidad añadida.