bonsoir ,
Il faut prendre attention au contexte du noeud (context node) qui est défini par le noeud sur lequel intervient le modéle ( template)
tes règles sont définies par des "fonctions' (pour donner une image commune)
avec les templates (<xsl:template match = "Xpath syntaxe">)
elles sont appelées grâce à <xsl:apply-templates select="Xpath expression"/>
Par exemple selon ton foramt de sortie tu définis le squelette de ton document( soit format Html)
<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output
indent="yes"
method="html"/>
<xsl:template match="/">
<html>
<body>
[b]<!-- application d'une règle : le contexte courant est '/' soit la racine du document -->[/b]
<xsl:apply-templates select="sous_root/contenu"/>
</body></html>
</xsl:template>
<!-- definition de tes regles qui seront appelée lorsque necessaire -->
<xsl:template match="contenu">
<p>
<xsl:value-of select="."/>
</p>
</xsl:template>
</xsl:stylesheet>
Le fait que les noeuds de type texte apparaisent c'est que des régles par défaut sont appliquées par le processeur Xslt et dans ce cas :
<xsl:template match="text() | @*>
<xsl:value-of select="."/>
</xsl:template>
EDIT : un petit exemple rapide pour mieux expliquer:
code xml
<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet href="xpathExpression.xsl" type="text/xsl"?>
<root>
<elementniveau1>
<elementniveau2>
texte niveau2 item 1
</elementniveau2>
<elementniveau2>
texte niveau2 item 2
</elementniveau2>
</elementniveau1>
<elementniveau1>
texte niveau 1 item 1
</elementniveau1>
</root>
dans le premier traitement xslt :
<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output
method="html"
encoding="iso-8859-1"/>
<xsl:template match="/">
<html>
<body>
<xsl:apply-templates select="[b]root/elementniveau1[/b]"/>
</body>
</html>
</xsl:template>
<!-- les templates -->
<xsl:template match="elementniveau2">
<p>
<xsl:value-of select='.'/>
</p>
</xsl:template>
</xsl:stylesheet>
on obtient en sortie :
a écrit :
texte niveau2 item 1
texte niveau2 item 2
texte niveau 1 item 1
le 'pattern' donné dans select de l'instruction
<xsl:apply-templates select="root/elementniveau1"/> selectionne une node-set (ensemble de noeud).incluant elementniveau1 et 2 , et comme aucune règle n'est donnée pour les 'elementniveau1' la règle par défaut donnée plus haut va s'appliquer ( text()) ...
Il faut donc préciser ta sélection en faisant :
<xsl:apply-templates select="root/elementniveau1/elementniveau2"/>
ou
<xsl:apply-templates select="//elementniveau2"/>
[i]<!-- selection de tous les éléments de type elementniveau2 -->[/i]
dans les 2 cas le résultat est :
a écrit :
texte niveau2 item 1
texte niveau2 item 2
si tu ne désire afficher que l'un des résultats tu peux utiliser un attribut identifiant dans le fichier xml :
<elementniveau1>
<elementniveau2 id="item1">
texte niveau2 item 1
</elementniveau2>
<elementniveau2>
......ect
et la règle xpath :
.....
<xsl:apply-templates select="root/elementniveau1/elementniveau2[@id='item1']"/>
....
Qui donne en résultat
a écrit :
texte niveau2 item 1
voilà ... désolé si j'ai fait un peu long
(ps : ce n'est pas la seulle manière d'arriver au même résultat bien sûr
)
Modifié par kzone (02 Aug 2007 - 01:59)