2011-04-18 7 views
20

J'ai 2 modèlesmodèle XSL priorité

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

Ma question est la suivante: quel modèle aura la priorité sur la transformation. Et quelqu'un peut-il me donner un aperçu/des ressources sur la préséance des modèles XSL?

Merci d'avance!

Répondre

38

Le processus de résolution complète est décrit dans section 5.5 of the XSLT spec.

En général, selon les règles suivantes dans l'ordre (par exemple un modèle éliminé de considération en raison de la priorité à l'importation inférieur est éliminé de façon permanente, quelle que soit sa priorité):

  1. modèles importés ont une priorité plus faible que les modèles dans la stylesheet primaire
  2. modèles avec une valeur plus élevée dans leur attribut priority ont une priorité plus élevée
  3. Modèles sans attribut priority sont affectées d'une priorité par défaut. Les modèles avec des motifs plus spécifiques ont la priorité.
  4. Il s'agit d'une erreur si les trois étapes précédentes laissent plusieurs modèles en considération, mais les processeurs XSLT peuvent récupérer par défaut le dernier dans le fichier.

Dans votre cas spécifique, les deux modèles ont la même priorité, donC# 4 ci-dessus s'applique. Pour démontrer:

<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> 

appliquée à cette entrée (les deux modèles en jeu):

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

Sortie:

template2 

Mais si nous échangeons l'ordre des modèles:

<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> 

Ensuite, la sortie est:

template1 
+1

Une bonne explication doit le rendre absolument clair que la priorité à l'importation et 'priority' sont deux choses différentes et quelle que soit la hauteur de priorité un modèle dans une feuille de style importée a, sa priorité est inférieure à la priorité de tout modèle dans la importer une feuille de style. –

+0

@Dimitre - J'ai voulu que les règles soient lues séquentiellement. Peut-être que ce n'était pas clair. J'ai ajouté un peu d'explication. –

+2

+1 Bonne réponse. ** Observation: Il est mauvais de s'appuyer sur un mécanisme de récupération d'erreur. ** –

Questions connexes