Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 3 sur 3
  1. #1
    Nouveau Membre du Club
    Inscrit en
    novembre 2008
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : novembre 2008
    Messages : 93
    Points : 25
    Points
    25

    Par défaut XML et XSL, xsl:template et xsl:apply-templates

    Bonjour !

    Je me suis mis il y a peu à l'XSL, et j'ai du mal à comprendre le mécanisme créé à partir des deux balises xsl:template et xsl:apply-templates. Le petit exemple ci-dessous illustre un cas où je ne comprend pas le résultat :

    voici un bout de fichier xml assez simple :

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    <BOOK ISBN="9782212090819" LANG="fr" SUBJECT="applications">
    	<AUTHOR>
    		<FIRSTNAME>Jean-Christophe</FIRSTNAME>
    		<LASTNAME>Bernadac</LASTNAME>
    	</AUTHOR>
    	<AUTHOR>
    		<FIRSTNAME>François</FIRSTNAME>
    		<LASTNAME>Knab</LASTNAME>
    	</AUTHOR>
    	<TITLE>Construire une application XML</TITLE>
    	<PUBLISHER>
    		<NAME>Eyrolles</NAME>
    		<PLACE>Paris</PLACE>
    	</PUBLISHER>
    	<DATEPUB>1999</DATEPUB>
    </BOOK>
    <BOOK ISBN="9782212090529" LANG="fr" SUBJECT="général">
    ...
    la partie principale de mon XSL :

    Code :
    1
    2
    3
    <xsl:template match="AUTHOR">
    	<famille><xsl:apply-templates select="LASTNAME"/></famille>
    </xsl:template>
    Donc dans mon esprit, mon xsl cherche les éléments dans l'xml "AUTHOR". Une fois trouvé, il garde en mémoire l'arbre qui découle de l'élément "AUTHOR". Ensuite, j'appel apply-templates sur les éléments "LASTNAME" et d'après ce que j'ai compris, il devrait alors renvoyer le contenu des éléments "LASTNAME". Or....j'ai ceci en résultat :

    Code :
    1
    2
    3
    4
    <famille>Bernadac</famille>
    <famille>Knab</famille>Construire une application XMLEyrollesParis1999
    <famille>Michard</famille>XML, Langage et ApplicationsEyrollesParis1998
    ...
    Il me renvoie bien le contenu des éléments "LASTNAME" dans des balises "famille", mais il me rajoute après le reste de l'arbre ("Construire une application XMLEyrollesParis1999")...je ne comprend pas bien pourquoi...

    Merci pour votre aide =)

  2. #2
    Modérateur

    Inscrit en
    septembre 2004
    Messages
    8 909
    Détails du profil
    Informations forums :
    Inscription : septembre 2004
    Messages : 8 909
    Points : 13 344
    Points
    13 344

    Par défaut

    C'est parce que, en XSLT, il existe deux règles invisibles, implicites, qui sont là même si tu ne les as pas demandées :

    Code :
    1
    2
    3
    <xsl:template match="*">
      <xsl:apply-templates/>
    </xsl:template>
    "Pour tout élément sur lequel tu appliques les templates, applique les templates à tout ce qu'il contient"

    Elle ne s'applique que s'il n'y a pas une règle plus précise sur l'élément en question, comme match="AUTHOR", qui est plus précise puisqu'elle donne le nom de l'élément au lieu de *

    Code :
    1
    2
    3
    <xsl:template match="text()">
      <xsl:copy/>
    </xsl:template>
    "Pour tout contenu texte sur lequel tu appliques les templates, copie-le tel quel"

    Donc, déroulement du traitement :

    - balise <BOOK> : pas de règle pour celle-ci, donc règle implicite, on applique les templates à tout ce qu'elle contient.
    - on arrive à <AUTHOR> : il y a une règle pour lui, on l'applique.
    - on arrive à <LASTNAME> : pas de règle, donc règle implicite.
    - on arrive au texte 'Bernadac' : règle implicite, on le copie tel quel.
    - fini <LASTNAME>
    - fini <AUTHOR>
    - on arrive à <AUTHOR> suivant, même fonctionnement
    - on arrive à <TITLE> : pas de règle, donc règle implicite.
    - on arrive au texte 'Construire une application XML' : règle implicite, on le copie tel quel.
    - fini <TITLE>
    - on arrive à <PUBLISHER> : pas de règle, donc règle implicite.
    - etc, etc, etc.

    Donc, comment régler le problème ?

    Code :
    1
    2
    3
    <xsl:template match="BOOK">
      <xsl:apply-templates select="seulementCeQueTuVeuwTraiter"/>
    </xsl:template>

  3. #3
    Nouveau Membre du Club
    Inscrit en
    novembre 2008
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : novembre 2008
    Messages : 93
    Points : 25
    Points
    25

    Par défaut

    Raaa je n'aurai pas pu espérer meilleure réponse !
    Merci beaucoup thelvin =)

+ Répondre à la discussion
Cette discussion est résolue.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •