2011-04-18 11 views
20

tengo 2 plantillasXSL plantilla de precedencia

<template match="vehicle_details[preceding-sibling::vehicle_type = '4x4']/*"> 
    ... 
</xsl:template> 
<xsl:template match="vehicle_details[descendant::color = 'red']/*" > 
    ... 
</xsl:template> 

Mi pregunta es: ¿qué plantilla tendrá prioridad sobre la transformación. ¿Y alguien puede darme una descripción/recursos sobre la precedencia de plantilla XSL?

¡Gracias de antemano!

Respuesta

38

El proceso de resolución completo se describe en section 5.5 of the XSLT spec.

En general, se aplican las siguientes reglas en orden (por ejemplo, una plantilla eliminado de consideración debido a la menor prioridad de importación se elimina de forma permanente, independientemente de su prioridad):

  1. plantillas importadas tienen menor prioridad que las plantillas en el de hojas de estilo primaria
  2. plantillas con un valor más alto en su atributo priority tienen mayor precedencia
  3. plantillas sin un atributo priority se les asigna una prioridad por defecto. Las plantillas con patrones más específicos tienen prioridad.
  4. Es un error si los tres pasos anteriores dejan en consideración más de una plantilla, pero los procesadores XSLT pueden recuperarse por defecto al último en el archivo.

En su caso específico, ambas plantillas tienen la misma prioridad, por lo que se aplica el n. ° 4 anterior. Para demostrar:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match= 
      "vehicle_details[preceding-sibling::vehicle_type = '4x4']/*"> 
     template1 
    </xsl:template> 
    <xsl:template match="vehicle_details[descendant::color = 'red']/*"> 
     template2 
    </xsl:template> 
</xsl:stylesheet> 

aplicables a esta entrada (tanto partido de las plantillas):

<root> 
    <vehicle_type>4x4</vehicle_type> 
    <vehicle_details> 
     <color>red</color> 
    </vehicle_details> 
</root> 

Salida:

template2 

Pero si cambiamos el orden de las plantillas:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="vehicle_details[descendant::color = 'red']/*"> 
     template2 
    </xsl:template> 
    <xsl:template match= 
      "vehicle_details[preceding-sibling::vehicle_type = '4x4']/*"> 
     template1 
    </xsl:template> 
</xsl:stylesheet> 

Luego la salida es:

template1 
+1

Una buena explicación debe dejar absolutamente claro que la precedencia de importación y 'priority' son dos cosas diferentes y cualquiera que sea la forma en prioridad alta una plantilla en una hoja de estilo importado, su prioridad es menor que la prioridad de cualquier plantilla en el importando hoja de estilo. –

+0

@Dimitre - Tenía la intención de leer las reglas secuencialmente. Quizás eso no estaba claro. He agregado un poco más de explicación. –

+2

+1 Respuesta correcta. ** Observación: es una mala práctica confiar en el mecanismo de recuperación de errores. ** –