Bonjour à tous. Je vous expose mon problème.

Voici mon XML :
<root>
<nom> Un nom </nom>
<prenom> Un prénom </nom>

<sous_root>
<contenu>
Je suis dans le contenu
</contenu>
</sous_root>
</root>

J'aimerais recuperer le contenu de "<contenu>". Malheureusement en appliquant un <xsl:template match = "contenu"/>, j'obtiens aussi en sortie le nom et prenom. Comment faire. J'ai essayé un <xsl:template match="/*"><xsl:apply-template select="contenu"/> </xsl:template>. Ca me donne un résultat positif dans certains traitements et d'autres non. Desolé si ça semble trivial pour vous. Comment faire ? Merci pour vos réponses Smiley smile
Modifié par stilya (03 Aug 2007 - 16:33)
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 Smiley cligne )
Modifié par kzone (02 Aug 2007 - 01:59)
Que dire à part merci pour cette réponse détaillée. J'ai toutes les réponses à mes questions. Encore merci kzone