Para bucles vs. aplicar-plantillas

Recientemente comencé a usar XSLT para algunos de mis documentos XML y tengo algunas preguntas. Agrego el código a continuación. En el código, tengo una plantilla que coincide con los elementos de ebook. Luego quiero enumerar todos los autores que escribieron el libro. Lo hago usando un para cada ciclo, pero también podría aplicarle una plantilla. No puedo ver una línea clara cuando usar bucles y cuándo usar plantillas.

Y otra pregunta es normal simplemente decir aplicar-plantillas cuando ahora que no habrá otros elementos secundarios del elemento donde lo está escribiendo. En mi caso, en la plantilla que coincide con la raíz del documento, digo apply-templates. Luego encuentra ebooks, que es el único hijo de él, pero podría tener un elemento de “libros” que distinga entre libros “normales” y libros electrónicos, entonces simplemente enumeraría los datos de los personajes de los libros. Entonces habría necesitado escribir apply-templates select = “ebooks” si solo quería los ebooks en mi documento final. Entonces, ¿este es un caso de eso, depende de qué tan bien conoces tu documento?

Gracias, aquí está mi código (Esto es solo para practicar):

XML:

    Advanced Rails Recipes: 84 New Ways to Build Stunning Rails Apps  Mike Clark  464 978-0-9787-3922-5 Ruby  2008 5 1  The Pragmatic Programmers  ... 

XSLT:

      Library        

Ebooks

,
Day Month Year

    Esta pregunta es un poco argumentativa, pero aquí está mi opinión sobre ella.

    No puedo ver una línea clara cuando usar bucles y cuándo usar plantillas.

    Diría que debes esforzarte por evitar for-each tan a menudo como sea posible a favor de apply-templates .

    Usar for-each hace que su progtwig sea más complejo agregando niveles de anidación y también es imposible reutilizar el código dentro del bloque for-each . Usar apply-templates (cuando se hace bien) generará XSLT más flexible y modular.

    Por otro lado: si escribe una hoja de estilo con una complejidad limitada y la posibilidad de reutilización o modualización no es una preocupación, usar for-each puede ser más rápido y más fácil de seguir (para un lector / mantenedor humano). Por lo tanto, es en parte una cuestión de preferencia personal.

    En tu caso, me parece elegante:

             ,   

    Para su otra pregunta

    Y otra pregunta es normal decir simplemente apply-templates cuando sabes que no habrá otros elementos secundarios del elemento donde lo estás escribiendo.

    Cuando sepa que nunca habrá niños en este elemento, escribir apply-templates tiene sentido.

    Cuando se hace bien, XSLT tiene la capacidad de tratar de forma flexible las diferentes entradas. Si espera que haya niños en algún momento, una apply-templates no le hará daño.

    Un simple apply-templates sin select es bastante inespecífico, tanto en términos de qué (es decir, todos) y en qué orden (es decir, el orden del documento de entrada) se procesarán los nodos. Por lo tanto, podría terminar procesando nodos que nunca quiso procesar o nodos que ya ha procesado anteriormente.

    Como no se puede escribir una plantilla sensata para los nodos desconocidos, tiendo a evitar las apply-templates no específicas y simplemente adaptar mi hoja de estilos cuando la entrada cambia.

    Lo hago usando un para cada ciclo, pero también podría aplicarle una plantilla. No puedo ver una línea clara cuando usar bucles y cuándo usar plantillas.

    Usar es perjudicial en modo alguno si se sabe exactamente cómo se procesa un .

    El problema es que muchos de los recién llegados a XSLT que tienen experiencia en progtwigción imperativa toman 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 una ya definida.

    Un uso indispensable de en XSLT 1.0 es cambiar el documento actual; esto a menudo es necesario para poder utilizar la función key() en un documento, diferente del documento XML fuente actual. por ejemplo, para acceder de manera eficiente a la tabla de búsqueda que reside en su propio documento xml.

    Por otro lado, usar y es mucho más poderoso y elegante.

    Estas son algunas de las diferencias más importantes entre los dos enfoques :

    1. xsl:apply-templates es mucho más rico y profundo que xsl:for-each , incluso simplemente porque no sabemos qué código se aplicará a 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 mucho después de que se haya escrito la xsl:apply template y de personas que no conozcan 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 .

    otra pregunta es normal decir simplemente aplicar-plantillas cuando (k) ahora que no habrá otros elementos secundarios del elemento donde lo está escribiendo

      

    es una forma abreviada de:

      

    Incluso si hay otros hijos del nodo actual, sobre los cuales no te importa, todavía puedes usar el corto y tener otra plantilla como esa:

      

    Esta plantilla ignora (“elimina”) cualquier elemento. Debe sobrescribirlo con plantillas más específicas (en XSLT, generalmente, las plantillas más específicas tienen mayor prioridad y se seleccionan para el procesamiento sobre plantillas menos específicas que coinciden con el mismo nodo):

        

    Normalmente no uso pero utilizo otra plantilla que coincide (e ignora) cada nodo de texto:

       

    Esto normalmente tiene el mismo efecto que usar , debido a la forma en que XSLT procesa los nodos para los que no hay una plantilla coincidente. En cualquier caso, XSLT usa sus plantillas incorporadas en lo que se puede llamar “procesamiento predeterminado”.

    El resultado del procesamiento predeterminado de XSLT de un subárbol enraizado en un elemento es generar la concatenación (en orden de documento) de todos los descendientes de nodo de texto de este elemento.

    Por lo tanto, evitar la salida de cualquier nodo de texto usando tiene el mismo resultado de salida (nulo) que impedir que la salida procese un elemento usando .

    Resumen :

    1. Las plantillas y la instrucción es la forma en que XSLT implementa y trata el polymorphism.

    2. Está en el espíritu del modelo de procesamiento de XSLT utilizar plantillas más genéricas que coincidan con grandes clases de nodos y hacer un procesamiento predeterminado para ellos y luego anular las plantillas genéricas con más específicas que coincidan y procesen únicamente los nodos en los que estamos interesados.

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

    Es común leer sobre xsl:for-each no es realmente necesario en XSLT, pero solo en ciertos casos. Normalmente deberías poder usar xsl:apply-templates way.

    Por ejemplo, su transformación se puede adaptar fácilmente sin xsl:for-each , cambie la plantilla del ebook la siguiente manera:

      

    y agregando este:

      ,  

    Para responder tu pregunta:

    No puedo ver una línea clara cuando usar bucles y cuándo usar plantillas.

    En XSLT, la diferencia se conoce como estilo “push” frente a “pull”, sobre el cual se puede leer algo bueno @ IBM developerWorks y @ XML.com .

    Mi regla sobre, usa bucles solo cuando no puedes imaginar cómo deshacerse de ellos :)).

    otra pregunta es normal decir simplemente aplicar-plantillas cuando (k) ahora que no habrá otros elementos secundarios del elemento donde lo está escribiendo

    Cuando tu dices”

      

    Simplemente le está diciendo al procesador que aplique plantillas a todos los elementos secundarios del nodo de contexto actual. Entonces depende si quieres eso o no :). Podrías tener diferentes hijos y la necesidad de aplicar plantillas a cualquiera de ellos. Realmente depende de la situación.

    Cuando usa solo , normalmente debe prestar atención a cómo se aplicarán las reglas incorporadas y, eventualmente, cerrarlas según sea necesario.

    Por ejemplo, en su caso podría haber usado también:

      

    Espero que esto ayude.

    En general, estoy de acuerdo con la respuesta de Dimitre. La razón principal para aconsejar a los principiantes a usar xsl: apply-templates en lugar de xsl: for-each es que una vez que estén cómodos y con experiencia con xsl: apply-templates, no les resultará difícil decidir entre las dos construcciones, mientras que, hasta que adquieran esa experiencia, usarán xsl: para cada uno de forma inapropiada.

    Los principales beneficios de xsl: apply-templates over for-each son que el código se adapta mejor a las estructuras de documentos cambiantes y a los requisitos de procesamiento cambiantes. Es difícil vender ese beneficio a las personas que solo quieren piratear un código juntos y no les importa cómo será el mundo dentro de tres años, pero es un beneficio muy real.