2009-04-10 6 views
6

Escucho una y otra vez cómo debe evitar el uso de XSLT para cada uno. Que es tu demonio interno de programación imperativa que debería ser desterrado.¿Qué tiene de malo xsl: for-each?

¿Qué tiene eso de malo?

¿Importa esta mejor práctica según el tamaño de XML (es decir, 100 vs 10 000 nodos)?

Respuesta

6

diferencia esencial entre <xsl:apply-templates> y <xsl:-for-each> que nadie ha señalado:

  1. <xsl:apply-templates> es realmente algo mucho más que un bonito equivalente, más elegante de <xsl:for-each>:

xsl:apply-templates es mucho más rico y más profundo que xsl:for-each, incluso 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 nodos diferentes de la lista de nodos.

Además, el código que se aplicará se puede escribir después de la forma en XSL: aplicar plantillas fue escrito y por la gente que no conoce el autor original.


_2. Por otro lado, usando <xsl:for-each> no es de ninguna manera perjudicial si se sabe exactamente cómo se procesa <xsl:for-each>.

El problema es que muchos de los recién llegados a XSLT que tienen experiencia en programación imperativa toman <xsl:for-each> como sustituto de un "bucle" en su PL favorito y piensan que les permite realizar lo imposible, como incrementar un contador o cualquier otra modificación de un <xsl:variable> ya definido.

Un uso indispensable de <xsl:for-each> es cambiar el documento actual; esto a menudo es necesario in order to be able to use the key() function on a document, different from the current source XML document, por ejemplo para acceder de manera eficiente a la tabla de búsqueda que reside en su propio documento xml.

2

Respuesta rápida: XSLT es en gran parte funcional por naturaleza, y los bucles imperativos no son muy funcionales.

En general la forma en base a sacar el máximo partido de XSLT es el uso de coincidencia de patrones tanto como sea posible (xsl:apply-template en lugar de bucles, IFS y llamar-1 plantilla ).

Al final, se trata de estilo, y hará poca diferencia en piezas cortas de XSLT, pero ser más funcional ayudará con problemas más largos/complejos.

Aparte de cuando se crean funciones que devuelven valores en lugar de modificar la salida.

+0

No hay nada "imperativo" en . Además, ¿qué quiere decir con "use-template"? No hay tal instrucción en XSLT. –

+0

s/use-template/call-template /: Typo – Richard

+0

bucle (o cualquier tipo) es en gran parte el reino de la programación imperativa. Funcionalmente uno usaría la recursión. – Richard

1

Al usar apply-templates, quizás con mode, hace que sea más fácil incluir las transformaciones apropiadas de más tipos de elementos que pueden ser de interés en esa ubicación.

Por ejemplo, si tiene XML que contiene el contenido de una biblioteca, y sigue usando para cada uno para seleccionar libros, luego comienza a grabar discos DVD, CD, galletas Ginger Nut, etc., tendrá que examine todas las secciones de cada una para incluir más que solo libros. Si utilizó plantillas de solicitud, puede crear simplemente las nuevas coincidencias para los nuevos elementos.

5

Las plantillas tienden a dividir el código más agradablemente. Además, cada bucle adolece del hecho de que las personas a menudo acuden a ellos con la idea de que operan de forma idéntica a la forma en que funcionan los bucles en los principales lenguajes de programación.

2

Es el uso de un for-each para llamar a las plantillas que se desaconseja, no el uso generalizado de for-each, per se. Incluso el Muenchian method of grouping se basa en constructos xsl:key con xsl:for-each bucles.

La idea de escribir un buen XSLT es que la estructura de su XML debe dictar qué plantillas coinciden y luego se aplican. Por lo tanto, siempre que sea posible, use apply-templates para seleccionar los nodos, en lugar de aplicar un seleccionar usando for-each.

Cuestiones relacionadas