IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

XSL/XSLT/XPATH XML Discussion :

Ordre des <xsl:template match="..">


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre éprouvé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Points : 937
    Points
    937
    Par défaut Ordre des <xsl:template match="..">
    Est-ce que l'ordre dans lequel les <xsl:template match="..."> apparaissent dans l'xsl a de l'importance ?
    Si par mégarde on introduit deux fois la même balise dans un xsl, comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <xsl:template match="toto"><xsl:value-of select="."/><br/></xsl:template>
     
    <xsl:template match="toto"><p><xsl:value-of select="."/></p></xsl:template>
    je constate que la deuxième déclaration s'impose sur la première.
    Aucune erreur n'est générée.

    Il y a d'autre situation où c'est aussi gênant. Par exemple cet ordre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <xsl:template match="toto[1]">...</xsl:template>
     
    <xsl:template match="toto">...</xsl:template>
    n'est pas équivalent à celui-ci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <xsl:template match="toto">...</xsl:template>
     
    <xsl:template match="toto[1]">...</xsl:template>
    Dans le premier cas, <xsl:template match="toto[1]">...</xsl:template> n'est pas pris en compte.

  2. #2
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Bonjour,

    en principe tes templates devraient être conçus justement de telle manière à ce que tu n'aies pas à te poser ce genre de question... Il est assez fréquent d'avoir plusieurs templates opérant sur les mêmes éléments, mais dans un contexte différent ; le contexte qui va déterminer le template utilisé parmi ceux possibles peut être défini de plusieurs manières :
    • en utilisant l'attribut « mode »
    • en définissant dans l'attribut « match » du template un chemin comprenant des éléments parents et/ou ancêtre dont l'élément doit être un descendant
    • en définissant dans « match » un prédicat qui va filtrer les éléments possibles

    Ces 3 méthodes peuvent être combinées pour un même template. Si tu as plusieurs templates qui concernent le même élément, mais avec des attributs « match » différents, c'est le template avec le pattern le plus restrictif (ou spécifique, si tu préfères) qui sera prioritaire sur les autres. Il existe enfin l'attribut « priority » qui permet de forcer l'ordre de priorité des templates, mais il est généralement reservé à des cas très particuliers, notamment pour résoudre des ambiguités dûes à un schéma XML complexe.
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  3. #3
    Membre éprouvé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Points : 937
    Points
    937
    Par défaut
    Oui, merci.
    Mais ça c'est quand un XSL est "bien écrit", ce qui n'est malheureusement pas toujours le cas.

    Dans dans mon premier exemple, qu'en est-il si on a deux "template match" sur la même balise sans distinction de mode, de contexte ou de prédicat ?
    Par expérience je constate que la première est ignorée. Aucune erreur n'est générée.

    Dans mon deuxième exemple il y a justement un prédicat ([1]). L'ordre de déclaration semble avoir une influence sur le résultat. Si le prédicat de spécialisation vient avant un cas plus général alors il sera ignoré.

  4. #4
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Citation Envoyé par camboui Voir le message
    Dans dans mon premier exemple, qu'en est-il si on a deux "template match" sur la même balise sans distinction de mode, de contexte ou de prédicat ?
    Par expérience je constate que la première est ignorée. Aucune erreur n'est générée.
    Ca s'explique par le fait que la spécification XSLT du W3C est assez laxiste en ce qui concerne ce cas de figure :
    [...]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.
    Citation Envoyé par camboui Voir le message
    Dans mon deuxième exemple il y a justement un prédicat ([1]). L'ordre de déclaration semble avoir une influence sur le résultat. Si le prédicat de spécialisation vient avant un cas plus général alors il sera ignoré.
    Désolé, je n'ai pas été assez précis dans mon explication précédente... La présence seule d'un prédicat n'influe pas sur l'ordre de priorité des templates, contrairement à la présence d'un chemin dans le « match » ; à charge pour le concepteur d'écrire ses prédicats de telle façon à ce que les templates s'excluent mutuellement.
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  5. #5
    Membre éprouvé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Points : 937
    Points
    937
    Par défaut
    Ok. Donc, en conclusion, s'il n'y a pas d'exclusion stricte dans l'écriture des "template match" (ce qui est de mauvaise conception, certes...), c'est bien le dernier déclaré dans l'XSL qui sera prioritaire.

Discussions similaires

  1. Réponses: 1
    Dernier message: 03/06/2009, 09h28
  2. [XSL]<xsl:template match> path
    Par *alexandre* dans le forum XML/XSL et SOAP
    Réponses: 1
    Dernier message: 19/07/2007, 13h24
  3. [XSL][débutant]trié l'ordre des éléments d'un fichier xml
    Par pistache42 dans le forum XSL/XSLT/XPATH
    Réponses: 5
    Dernier message: 19/04/2006, 10h37
  4. [XSL]ordre des transformations...
    Par snoop dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 30/03/2006, 11h20
  5. [XSL] Ordre des éléments présentés
    Par Cupidon dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 23/01/2006, 13h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo