Précédent   Forum du club des développeurs et IT Pro > Autres langages > XML/XSL et SOAP
XML/XSL et SOAP Forum d'entraide sur XML et SOAP. Avant de poster -> FAQ XML, Sources XML
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 14/10/2012, 16h37   #1
kegilko
Nouveau Membre du Club
 
Inscription : novembre 2008
Messages : 91
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 91
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 =)
kegilko est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/10/2012, 18h15   #2
thelvin
Modérateur
 
Inscription : septembre 2004
Messages : 7 121
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 7 121
Points : 10 358
Points : 10 358
Envoyer un message via Skype™ à thelvin
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>
thelvin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/10/2012, 19h24   #3
kegilko
Nouveau Membre du Club
 
Inscription : novembre 2008
Messages : 91
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 91
Points : 25
Points : 25
Raaa je n'aurai pas pu espérer meilleure réponse !
Merci beaucoup thelvin =)
kegilko est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 06h50.


 
 
 
 
Partenaires

Hébergement Web