Un peu d'animation dans du XML ?

Eléphant du PHP | 70 Messages

05 sept. 2005, 21:56

Ca y est, je me mets au XML/XSL !
Hola ! Sous une apparence simple, c'est coton !
Ramenant un XML issu d'une base MYSQL, mon vendeur de vélo
(qui connait le PHP :lol: )
affiche la liste des pièces de ses vélos (phpfrance.xml)

Code : Tout sélectionner

<?xml version="1.0" encoding="ISO-8859-1" ?> <!-- C'est l'histoire d'un magasin de vélo --> <pieces> <piece> <matricule>1234</matricule> <description>Rayon</description> <prix>1.25</prix> </piece> <piece> <matricule>6532</matricule> <description>Pneu rouge</description> <prix>3.75</prix> </piece> <piece> <matricule>6534</matricule> <description>Pneu vert</description> <prix>3.85</prix> </piece> </pieces>
Pour cela il utilise un vieux HTML tout poussiéreux mais qui connait (quand même le JAVASCRIPT Twisted Evil ) nommé phpfrance.htm :wink:

Code : Tout sélectionner

<html> <header> <script type="text/javascript"> var Cible = "<div id='Cible' style:'background-color:#00EEFF;'>Cible<br><input name='Cible' value='Cible' size=10></div>"; function AfficheXML(FormeXSL,Cible) { // chargement du fichier XML var xmlObj = new ActiveXObject("Microsoft.XMLDOM"); xmlObj.async = false; xmlObj.load("phpfrance.xml"); // chargement du fichier XSL var xslObj = new ActiveXObject("Microsoft.XMLDOM"); xslObj.async = false; xslObj.load(FormeXSL); // transformation en Html var htmObj = xmlObj.transformNode(xslObj); document.getElementById(Cible).innerHTML = htmObj; } function EffaceXML() { document.getElementById('Cible').innerHTML = Cible; } </script> </header> <body onload="EffaceXML()"> <div id='Début' onclick="AfficheXML('phpfrance.xsl','Cible')">cliquez moi pour afficher le XML<br> <input name='Début' value='Début' size=10> </div> <div id='Cible'></div> <div id='Suite' style:'background-color:#FF00FF;' onclick="EffaceXML()">cliquez moi pour effacer le XML et remettre le input du début<br> <input name='Suite' value='Suite' size=10> </div> </body> </html>
Afficher la liste des différentes pièces est très simple

Code : Tout sélectionner

<?xml version="1.0" encoding="ISO-8859-1"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl"> <xsl:template match="/"> <span> Matricule <br /> <select name="matricule"> <xsl:for-each select="pieces/piece"> <option><xsl:value-of select="matricule" /></option> </xsl:for-each> </select> </span> </xsl:template> </xsl:stylesheet>
Mais l'affaire m'a rendu gourmand !
Si c'est pour faire cela, j'aurais pu utiliser XMLHTTPRequest avec une sortie texte qui me générait du JAVASCRIPT !
Maintenant, je voudrais afficher selon la sélection du SELECT (notez le caractère bégueillant de l'affaire )
la description de la pièce en cours de sélection (sic)
J'ai lu chez un de mes pottes de forum (h2o) une possibilité d'ajouter derrière le </select> un truc du genre

Code : Tout sélectionner

<br/> Description : <br/> <input name="description" type="text"> <xsl:attribute name="value"> <xsl:value-of select="pieces/piece[matricule= $matricule]/matricule"/> </xsl:attribute> </input> <br/> Prix: <br/> <input name="prix" type="text"> <xsl:attribute name="value"> <xsl:value-of select="pieces/piece[matricule= $matricule]/prix"/> </xsl:attribute> </input>
Mais quel est le magicien qui va récuperer et comment le $matricule ???
J'avoue mon ignorance la plus crasse
Si quelqu'un a une suggestion (constructive ! pas de revendre ma boutique de vélos :shock: ) ?

h2o
Eléphant du PHP | 81 Messages

06 sept. 2005, 09:22

SI j'ai bien compris la demande.

Dans ton document xsl, juste avant le premier template, tu crées les paramètres. Ceux-ci peuvent ou non comporter une valeur par défaut.

Sans valeur par défaut :

Code : Tout sélectionner

<xsl:param name="matricule"/>
Avec valeur par défaut :

Code : Tout sélectionner

<xsl:param name="id">125</xsl:param>
Ensuite, tu peux utiliser le paramètre en plaçant le traditionnel signe "$" devant le nom : $matricule.

Pour afficher la valeur du paramètre, deux méthodes :

1. J'utilise "value-of" :

Code : Tout sélectionner

<span> <xsl:attribute name="class"> <xsl:value-of select="$id"/> </xsl:attribute> <xsl:text>Le texte</xsl:text> </span>
2. moins verbeux, en cas de valeur d'un attribut, je place le paramètre entre parenthèses :

Code : Tout sélectionner

<span class="{$id}"> <xsl:text>Le texte</xsl:text> </span>
1 et 2 affichent le même résultat :

Code : Tout sélectionner

<span class="125">Le texte</span>
Voilà, j'espère avoir répondu à la question.
Jean-Marie Hoornaert - h2o
Aide au développement et formation FileMaker, xml et AppleScript

Eléphant du PHP | 70 Messages

06 sept. 2005, 17:57

C'est dur de se faire comprendre !
Mon cher H2O, les valeurs données au MATRICULE ne le sont que pour l'élément sélectionné
attribut="selected" peut-être ... ?
et n'a pas de valeur par défaut (au pire la première valeur) et
selon à cette valeur, j'attends les valeurs de la DESCRIPTION et du PRIX

Un formulaire en HTML aurait une routine JAVASCRIPT en ONCHANGE="Tagada(document.form.matricule)
mais en XSL, j'avoue ne pas trouver de piste mais cela doit être possible
je vais retourner consulter la doc :?:

Eléphant du PHP | 70 Messages

06 sept. 2005, 20:33

pour qu'un XML s'affiche sur la liste des MATRICULES et qu'après cette liste il affiche la DESIGNATION et le PRIX de la PIECE dont le MATRICULE est sélectionné, je ne vois pas par quel mécanisme il raffraichirait ses valeurs
je serais très heureux d'être contredit sur ce point.
Mais le truc qui fonctionne est un rechargement du résultat sur un ONCHANGE de type JAVASCRIPT ...