Resolució de conflictes de prioritat en plantilles XSLT 1.0
Publicat el 22/06/2007
Per determinar quin TEMPLATE s'ha d'aplicar quan la selecció d'un node aplica a múltiples TEMPLATE s'han de tenir en compte els següents criteris:
- Tots els TEMPLATE que tinguin menor precedència d'importació que el TEMPLATE seleccionat es descarten.
- Tots els TEMPLATE que tinguin menor prioritat que el TEMPLATE seleccionat es descarten. La prioritat per defecte es computa segons les següents regles:
- Si el patró conté múltiples alternatives separades per
|es tractarà com si fossin TEMPLATE separats, un per cada alternativa. - Si el patró conté un nom qualificat (QName) o una instrucció de procés (PI), precedit per un axis de tipus
child::oattribute::la prioritat és 0. - Si el patró conté la forma
NCName:*precedit per un axis de tipuschild::oattribute::la prioritat és -0.25. - Si el patró és una evaluació de nodes precedida per un axis de tipus
child::oattribute::la prioritat és -0.5. - Sinó la prioritat és 0.5.
- Si el patró conté múltiples alternatives separades per
Nota: Davant de dubtes millor mirar el punt 5.5 (Conflict Resolution for Template Rules) de l'especificació XSLT 1.0.
Aquest sistema porta en la majoria de casos a conflictes insolubles ja que usar una selecció de tipus:
<xsl:template match="node">
(...)
</xsl:template>
o una selecció de tipus:
<xsl:template match="ancestorNode//node">
(...)
</xsl:template>
Ambdues seleccions computen igual: 0.5.
Això es converteix en un problema ja que l'especificació diu explícitament:
It is an error if this leaves more than one matching template rule. An XSLT processor may signal the error; if it does not signal the error, it must recover by choosing, from amongst the matching template rules that are left, the one that occurs last in the stylesheet.
XSLT 1.0 - Conflict Resolution for Template Rules
Per resoldre inequívocament un conflicte, l'especificació XSLT 1.0 proporciona l'atribut "priority" que permet forçar la prioritat al valor desitjat.
A l'especificació del gener del 2007 d'XSLT 2.0 la cosa no és gaire més resolutiva, crec que un model més semblant a l'especificitat de CSS aniria millor.
Comentaris