transformar online example xslt

example - xslt online



Rendimiento: call-template vs apply-template (3)

en el procesamiento XSLT, ¿hay una diferencia de rendimiento entre apply-template y call-template? En mis hojas de estilo hay muchas instancias en las que puedo usar cualquiera, ¿cuál es la mejor opción?


Al igual que con todas las preguntas de rendimiento, la respuesta dependerá de su configuración particular (en particular, el procesador XSLT que esté utilizando) y del tipo de procesamiento que esté realizando.

<xsl:apply-templates> toma una secuencia de nodos y los revisa uno a uno. Para cada uno, ubica la plantilla con la prioridad más alta que coincide con el nodo y la invoca. Así que <xsl:apply-templates> es como un <xsl:for-each> con un <xsl:choose> inside, pero más modular.

Por el contrario, <xsl:call-template> invoca una plantilla por nombre. No hay cambios en el nodo de contexto (no <xsl:for-each> ) y no hay opción sobre qué plantilla usar.

Entonces, exactamente con las mismas circunstancias, puede imaginarse que <xsl:call-template> será más rápido porque está haciendo menos trabajo. Pero si se encuentra en una situación en la que se pueden <xsl:apply-templates> o <xsl:call-template> , probablemente esté haciendo <xsl:for-each> y <xsl:choose> usted mismo, en XSLT, en lugar de que el procesador lo haga por usted, detrás de las escenas. Entonces, al final, creo que probablemente se equilibrará. Pero como digo, depende en gran medida del tipo de optimización que su procesador haya puesto en marcha y exactamente qué procesamiento está haciendo. Mídelo y mira.

Mis reglas generales sobre cuándo usar plantillas coincidentes y cuándo usar plantillas con nombre son:

  • use <xsl:apply-templates> y haga coincidir plantillas si está procesando nodos individuales para crear un resultado; use modos si un nodo particular necesita ser procesado de varias maneras diferentes (como en el índice versus el cuerpo de un documento)
  • use <xsl:call-template> y una plantilla con nombre si está procesando algo que no sea un nodo individual, como cadenas o números o conjuntos de nodos
  • (en XSLT 2.0) use <xsl:function> si está devolviendo un valor atómico o un nodo existente

Puede depender del analizador xml que esté utilizando. No puedo hablar más que del analizador de .NET 2003 donde realicé algunas pruebas de rendimiento informales sobre el código XSLT push vs pull . Esto es similar a lo que está preguntando: apply-template = push y call-template = pull. Estaba convencido de que el empuje sería más rápido, pero ese no era el caso. Era sobre incluso.

Lo siento, no tengo las pruebas exactas ahora. Recomiendo probarlo con su analizador de elección y ver si hay alguna diferencia importante. Mi apuesta es que no habrá.


apply-template y call-template no realizan la misma tarea, la comparación de rendimiento no es realmente relevante aquí. call-template toma un nombre de plantilla como parámetro, mientras que apply-template toma una expresión xpath. Aplicar plantilla es, por lo tanto, mucho más potente ya que no se sabe realmente qué plantilla se ejecutará. Obtendrá problemas de rendimiento si utiliza expresiones complejas xpath. Evite "//" en sus expresiones xpath ya que cada nodo de su documento de entrada será evaluado.