Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
804 connectés 

  FORUM HardWare.fr
  Programmation
  XML/XSL

  Passer un paramètre aux noeuds enfants

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Passer un paramètre aux noeuds enfants

n°1547924
haazheel
Posté le 24-04-2007 à 11:28:53  profilanswer
 

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

mood
Publicité
Posté le 24-04-2007 à 11:28:53  profilanswer
 

n°1548315
rx__
Paint It Black
Posté le 24-04-2007 à 18:05:15  profilanswer
 

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>


n°1548327
haazheel
Posté le 24-04-2007 à 18:38:15  profilanswer
 

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

n°1548763
rx__
Paint It Black
Posté le 25-04-2007 à 17:39:42  profilanswer
 

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

n°1550307
haazheel
Posté le 26-04-2007 à 22:47:16  profilanswer
 

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

n°1550408
rx__
Paint It Black
Posté le 27-04-2007 à 10:14:45  profilanswer
 

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.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  XML/XSL

  Passer un paramètre aux noeuds enfants

 

Sujets relatifs
Passer d'une JFrame a une autrePassage de paramètre
ouvrir une nouvelle fenêtre avec paramètre?fonction avec table hash en parametre
Passage d'une requête en paramètre[php]Problème de parametre
[PHP] passer caractères accentués en majusculeParamètre Batch
Passer un d'argument ??[directX] comment passer du model space au screen space ?
Plus de sujets relatifs à : Passer un paramètre aux noeuds enfants


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR