Bonjour.
J'ai passé des heures à chercher, chercher et rien, de vagues bidouilles sans issue.

J'ai créé un xml. Je souhaite, par défaut, afficher tous les nom des trucs sur une page (sans leurs fils, à savoir les bidules). Ici je le fait à l'aide d'un xsl parce que je ne voyais pas d'autres solutions.

Le problème est le suivant : lorsque l'on clique sur le nom d'un truc, je souhaitrais que s'affiche (sous celui-ci) tous ses chers enfants les bidules !
Et quand on reclique, qu'ils disparaissent.

En fait, c'est à peu près ce que ferait firefox avec les "+" et les "-" si vous regardez le fichier machins.xml avec firefox.

C'est peut-être pas dur mais c'est impossible pour moi Smiley bawling

Voici la source du xml :

<?xml version="1.0" encoding="iso-8859-1" standalone="yes"?>
<?xml-stylesheet type="text/xsl" href="machins.xsl"?>
<!DOCTYPE machins [
 <!ELEMENT machins (trucs+)>
  <!ELEMENT trucs (bidule+)>
  <!ATTLIST trucs nom CDATA #REQUIRED>
   <!ELEMENT bidule (#PCDATA)>
  <!ATTLIST bidule code ID #REQUIRED relatif IDREFS #IMPLIED>
]>
<machins>
   <trucs nom="maison">
     <bidule code="A-1" relatif="A-2 A-4">porte</bidule>
     <bidule code="A-2"                  >fenêtre</bidule>
     <bidule code="A-3"                  >cheminée</bidule>
     <bidule code="A-4"                  >volet</bidule>
   </trucs>
   <trucs nom="voiture">
     <bidule code="B-1" relatif="B-3">néon K2000</bidule>
     <bidule code="B-2"              >volant qu'on pète type "moumoute" professionnel</bidule>
     <bidule code="B-3"              >sapin qui sent bon</bidule>
   </trucs>
   <trucs nom="boîte">
     <bidule code="C-1"                  >chaussure</bidule>
     <bidule code="C-2"                  >cassoulet</bidule>
     <bidule code="C-3" relatif="C-1 C-4">vampire</bidule>
     <bidule code="C-4"                  >pochtron</bidule>
   </trucs>
</machins>


Voici la source du fichier machins.xsl qui le représente PAR DEFAUT :

<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:template match="/">
  <xsl:for-each select="machins/trucs">
   <span style="font: bold 12px verdana">
    <xsl:value-of select="@nom" /><br />
   </span>
<span><br /></span>
  </xsl:for-each>
 </xsl:template>
</xsl:stylesheet>


Merci d'avance à tous.
Modifié par metrallik (05 Sep 2006 - 01:23)
Bonjour,

J'imagine que tu souhaites traiter cette question coté client. Dans ce cas seul javascript pourra d'aider. Avec XSL tu vas créer un document XHTML qui contient l'ensemble des informations.
Avec un javascript tu modifies une propriété CSS (par exemple la propriété display) de la collection de bidules lorsque l'utilisateur clique sur le truc associé à la collection.
Oui dans le XSL on peut mettre du javascript, mais c'est bien dans le javacript que l'on a l'affichage ou non des éléments.

Sans m'être penché sur l'exemple de Gilles, il sera donc mieux placé pour répondre Smiley cligne , je crois que ce qu'il propose c'est d'avoir un document XHTML, disposant d'un javascript appelant lui même du code XSLT. Dans ce cas, au lieu de modifier l'affichage par la modification d'une propriété CSS comme je l'avais proposé, il modifie la structure du document pour retirer ou pas un contenu. Cela fonctionne également, pour peu que le navigateur dispose d'un processeur XSLT. Mais il faut bien voir que, dans ce cas, le XSLT est dans le javascript (coté client), et non l'inverse.
Merci de ces réponses très pédagogiques.

Je vais donc plutôt partir dans votre direction le javascript.
Mais ce que je me pose comme question c'est que si je modifie une propriété css, ne va-t-elle pas s'appliquer à tous les bidules de tous les trucs ?
C'est-à-dire, niveau rendu, faire comme si on remplaçait le fichierxsl "par défaut" (déjà posté) par celui-ci :

<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:template match="/">
  <xsl:for-each select="machins/trucs">
   <span style="font: bold 12px verdana">
    <xsl:value-of select="@nom" /><br />
   </span>

<xsl:for-each select="bidule">
    <span style="font: 9px verdana">
     <li>
      <xsl:value-of select="." />
     </li><br />
    </span>
</xsl:for-each>
<span><br /></span>
  </xsl:for-each>
 </xsl:template>
</xsl:stylesheet>


En fait, ce que je ne saisis pas, c'est comment on va pouvoir cibler seulement les bidules d'un truc et non agir sur tous les bidules de tous les trucs.

Merci.
Xavier a écrit :
Oui dans le XSL on peut mettre du javascript, mais c'est bien dans le javacript que l'on a l'affichage ou non des éléments.

Sans m'être penché sur l'exemple de Gilles, il sera donc mieux placé pour répondre Smiley cligne , je crois que ce qu'il propose c'est d'avoir un document XHTML, disposant d'un javascript appelant lui même du code XSLT. Dans ce cas, au lieu de modifier l'affichage par la modification d'une propriété CSS comme je l'avais proposé, il modifie la structure du document pour retirer ou pas un contenu. Cela fonctionne également, pour peu que le navigateur dispose d'un processeur XSLT. Mais il faut bien voir que, dans ce cas, le XSLT est dans le javascript (coté client), et non l'inverse.


Effectivement, c'est ce que je propose. Et il est exact aussi que cette partie de mon cours date d'une époque où je ne connaissais pas Firebird. Résultat : un IE-centrisme torp marqué, sur lequel il faut que je revienne. Zut, et moi qui croyais que je pourrais continuer à bosser sur un chapitre consacré aux validateurs automatiques pour le XHTML, et sur un autre consacré à XML/CSS, j'avais oublié celui-là!
metrallik a écrit :
Mais ce que je me pose comme question c'est que si je modifie une propriété css, ne va-t-elle pas s'appliquer à tous les bidules de tous les trucs ?
Ah mais il ne s'agit pas de modifier la feuille de style ! avec javascript on modifie une propriété CSS d'un objet du DOM. C'est donc ton javascript qui choisit le ou les éléments sur lesquels on va modifier une propriété.

Par ailleurs je ne cautionne pas le XSLT que tu as posté car il ne génére pas du XHTML valide. Il y a beaucoup de possibilités valides, mais prenons un exemple :
<p>nom du truc1</p>
<ul>
  <li>bidule a</li>
  <li>bidule b</li>
</ul>
<p>nom du truc2</p>
<ul>
  <li>bidule x</li>
  <li>bidule y</li>
  <li>bidule z</li>
</ul>
Il te suffit alors sur les éléments <p> de gerer un événement onclick, puis de prendre l'élément suivant dans le DOM et de modifier sa propriété display.
a écrit :
Il te suffit alors sur les éléments <p> de gerer un événement onclick, puis de prendre l'élément suivant dans le DOM et de modifier sa propriété display.


C'est du chinois je crois ...

Désolé, je suis peut-être trop mauvais.
Je pensais que ce serait pas très compliqué à faire mais je me pose des question ...
J'ai fait une recherche sur google : "dom aide xml" et oh miracle, je tombe sur ce topic Smiley eek !!

Si vous abandonnez, je ne vous en voudrez pas !
Merci.
Modifié par metrallik (09 Sep 2006 - 14:37)
Bonjour.
Je suis sur une piste donc pas besoin de répondre pour le moment ...
Verdict : demain (nomalement!).
Yves.