Passer un paramètre aux noeuds enfants

Passer un paramètre aux noeuds enfants - XML/XSL - Programmation

Marsh Posté le 24-04-2007 à 11:28:53    

Bonjour à tous,
 
j'ai un petit souci avec ma feuille de style XSL:
 
Soit le XML suivant:
 

Code :
  1. <Base>
  2.   <Chapitres OtherDir="Common">
  3.     <Chapitres>
  4.       <Text>1</Text>
  5.       <Text>2</Text>
  6.     </Chapitres>
  7.     <Text>3</Text>
  8.   </Chapitres>
  9.   <Chapitres>
  10.     <Text>4</Text>
  11.   </Chapitres>
  12. </Base>


 
J'aimerais appliquer un template différent pour tous les noeuds (Chapitres et Text) fils du premier Chapitres, parce qu'il a un attribut "OtherDir", et le template normal pour le dernier Chapitres, parce qu'il n'en a pas...
 
Comment je peux faire ça?
 
Merci d'avance
 
Mike

Reply

Marsh Posté le 24-04-2007 à 11:28:53   

Reply

Marsh Posté le 24-04-2007 à 18:05:15    

Un template placé avant un autre est plus prioritaire, donc si tu mets des restrictions sur son "match", tu peux traiter en priorité des noeuds particuliers. Par exemple, tu peux t'intéresser aux Chapitres qui ont l'attribut OtherDir ou qui ont parmis leurs parents un Chapitres avec cet attribut:

Code :
  1. <xsl:template match="Chapitres[count(ancestor-or-self::Chapitres/@OtherDir)]">
  2.   Avec OtherDir
  3.   <xsl:apply-templates />
  4. </xsl:template>
  5. <xsl:template match="Chapitres">
  6.   Sans OtherDir
  7.   <xsl:apply-templates />
  8. </xsl:template>


Reply

Marsh Posté le 24-04-2007 à 18:38:15    

Merci pour ta réponse,
 
c'est presque ça, j'ai néanmoins encore un souci...
 
En effet, seuls les premiers noeuds enfants sont traités...
 
Ex:
 

Code :
  1. <Chapitres Text="Vidéo" OtherDir="Common">
  2. <Chapitres Text="Lecteur vidéo">
  3.  <Chapitres Text="Fenêtre du lecteur vidéo" Lien="TVideoAffich">
  4.   <Chapitre>
  5.    <Text>Panneau supérieur</Text>
  6.    <Lien>TVideoAffichPanel1</Lien>
  7.   </Chapitre>
  8.   <Chapitre>
  9.    <Text>Affichage de la vidéo</Text>
  10.    <Lien>TVideoAffichCentre</Lien>
  11.   </Chapitre>
  12.   <Chapitre>
  13.    <Text>Barre d'informations</Text>
  14.    <Lien>TVideoAffichStatusBar</Lien>
  15.   </Chapitre>
  16.  </Chapitres>
  17.  <Chapitre>
  18.   <Text>Aller à</Text>
  19.   <Lien>TVideoGoTo</Lien>
  20.  </Chapitre>
  21.  <Chapitre>
  22.   <Text>Nouvelle sélection</Text>
  23.   <Lien>TVideoNewSel</Lien>
  24.  </Chapitre>
  25. </Chapitres>
  26. <Chapitre>
  27.  <Text>Liste de lecture d'une compilation</Text>
  28.  <Lien>TLectureCompil</Lien>
  29. </Chapitre>
  30. </Chapitres>


 
Ici, les noeuds Affichage de la vidéo, Barre d'informations et Nouvelle Sélection sont traités comme des chapitre normaux...
 
Le problème vient je pense de la directive xsl:apply-template
 

Code :
  1. <xsl:template match="Chapitre[count(ancestor-or-self::Chapitres/@OtherDir)]">
  2. <div>
  3.  <img src="{concat($DirImages,'dot.gif')}" alt="Chapitre" />
  4.  <a href="{concat('?filter=',$Filter,'&amp;file=C/',Lien)}"><xsl:value-of select="Text" /></a>
  5.  <xsl:apply-templates select="Chapitres | Chapitre"/>
  6. </div>
  7. </xsl:template>


 
Comment spécifier ici d'utiliser le template "avec" OnDir?
 
Merci d'avance
 
Mike

Reply

Marsh Posté le 25-04-2007 à 17:39:42    

Pour rester cohérent tu peux utiliser le même principe: match="Text[count(ancestor::Chapitres/@OtherDir)]".

Reply

Marsh Posté le 26-04-2007 à 22:47:16    

Encore merci, ça marche impec' maintenant...
 
Néanmoins, j'ai une dernière question pour rendre le code un peu plus clair.
 
Comment utiliser une condition dans le match="" pour un attribut?
 

Code :
  1. <xsl:template match="Chapitres/@Lien[count(???)]>
  2. </xsl:template>


 
Comment donner comme condition ici que le noeud Chapitres pour lequel l'attribut Lien est utilisé ici, ait un attribut OtherDir existant?
 
J'ai ça pour différencier les noeuds Lien

Code :
  1. <xsl:template match="Lien[count(ancestor::Chapitres/@OtherDir)]">


 
J'ai essayé

Code :
  1. <xsl:template match="Chapitres/@Lien[count(Chapitres//@OtherDir)]">


Code :
  1. <xsl:template match="Chapitres/@Lien[count(ancestor-or-self::Chapitres/@OtherDir)]">


Mais la version générique est toujours sélectionnée...
 
Sinon, comment accéder au noeud contenant l'attribut du match=""?

Code :
  1. <Chapitres Text="yes" Lien="no">
  2.     Roger
  3. </Chapitres>


Code :
  1. <xsl:template select="Chapitres/@Lien">
  2. </xsl:template>


 
Que mettre dans le template pour afficher Roger? Ou bien Text?
 
Merci d'avance

Reply

Marsh Posté le 27-04-2007 à 10:14:45    

Dans le dernier exemple (attention, tu as mis xsl:template select="", c'est match="", le select s'utilise avec xsl:apply-templates), tu peux écrire
 
match="Chapitres[count(@Lien) and count(@OtherDir)]"
 
Tu matches tous les Chapitres à condition qu'il y ait un attribut Lien et un attribut OtherDir.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed