XSLT

XSLT - XML/XSL - Programmation

Marsh Posté le 18-06-2012 à 01:28:19    

Bonsoir tout le monde,
 
Donc voila je coince depuis un moment pour transformer mon fichier xml en html.
Le problème c'est j'arrive pas à mettre les titres et prix des livres pour chaque éditeurs,  
voici mon code xml :

Code :
  1. <?xml version="1.0" encoding="utf-8" ?>
  2. <livres>
  3. <livre isbn="2841771482" annee="2002">
  4. <titre>Comprendre XSLT</titre>
  5. <auteur>Bernd Amann</auteur>
  6. <auteur>Philippe Rigaux</auteur>
  7. <resume>les webmastres d’aujourd’hui cherche</resume>
  8. </livre>
  9. <livre isbn="2841772373" annee="2003">
  10. <titre>Pratique de MYSQL et PHP</titre>
  11. <auteur>Philippe Rigaux </auteur>
  12. </livre>
  13. <livre isbn="2841779754" annee="1988">
  14. <titre>Savoir Programmer</titre>
  15. <auteur>Marc Lemaire</auteur>
  16. <auteur>Laurence Cesarini</auteur>
  17. <auteur>Dan Vodislav</auteur>
  18. <resume>Programmation pour les nuls</resume>
  19. </livre>
  20. <livre isbn="2456652271" annee="1994">
  21. <titre>Base de donnée Mysql/Oracle</titre>
  22. <auteur>Brahim Derdouri</auteur>
  23. <auteur>Mohammed Naîmi</auteur>
  24. </livre>
  25. <livre isbn="2456652401" annee="2004">
  26. <titre>Architecture des Ordinateurs</titre>
  27. <auteur>Bennoît Miramond</auteur>
  28. </livre>
  29. <livre isbn="2456651054" annee="2009">
  30. <titre>Logique et Programmation Logique</titre>
  31. <auteur>Yannick Kergosien</auteur>
  32. <auteur>Hans Rugh</auteur>
  33. <auteur>Christian Daveau</auteur>
  34. <auteur>Laura Hernandez</auteur>
  35. </livre>
  36. <livre isbn="2456659083" annee="2000">
  37. <titre>Developpement Web</titre>
  38. <auteur>Sebastien Chavanel</auteur>
  39. <auteur>Programmation Systeme</auteur>
  40. </livre>
  41. <livre isbn="2456651121" annee="2012">
  42. <titre>Réseau et Déploiment</titre>
  43. <auteur>Dntt</auteur>
  44. </livre>
  45. <editeur nom="0'Reilly">
  46. <isbn prix="18">2841772373</isbn>
  47. <isbn prix="33">2841771482</isbn>
  48. <isbn prix="14">2841779754</isbn>
  49. </editeur>
  50. <editeur nom="Dunod">
  51. <isbn prix="18">2456652271</isbn>
  52. <isbn prix="53">2456652401</isbn>
  53. <isbn prix="13">2456651054</isbn>
  54. <isbn prix="23">2456659083</isbn>
  55. <isbn prix="10">2456651121</isbn>
  56. </editeur>
  57. </livres>

 
 

Code :
  1. <?xml version="1.0" encoding="ISO-8859-1"?>
  2. <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  3. <xsl:template match="/">
  4.   <html>
  5.     <head>
  6.       <title>Exemple de sortie HTML</title>
  7.       <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
  8.     </head>
  9.     <body>
  10. <xsl:for-each select="//editeur">  
  11.    <b>
  12.    <xsl:value-of select="@nom" /> (
  13.    <xsl:value-of select="count(isbn)" /> Livres)
  14. <br/>
  15.   </b>
  16. <ol><xsl:for-each select="//livre">
  17.  <li><xsl:if test="@isbn = //editeur/isbn">
  18.      <i><xsl:value-of select="titre" /></i>
  19.   (<xsl:value-of select="@annee" /> )
  20.   <xsl:value-of select="//editeur/isbn/@prix" /> euros,
  21.  nombre d'auteurs : <xsl:value-of select="count(auteur)" />
  22.  </xsl:if>
  23.  </li>
  24.       </xsl:for-each>
  25. </ol>
  26. </xsl:for-each>
  27. </body>
  28.   </html>
  29. </xsl:template>
  30. </xsl:stylesheet>

 
 
et voila le résultat en html :
 
0'Reilly ( 3 Livres)
 
 1.Comprendre XSLT (2002) 18 euros, nombre d'auteurs : 2
 2.Pratique de MYSQL et PHP (2003) 18 euros, nombre d'auteurs : 1
 3.Savoir Programmer (1988) 18 euros, nombre d'auteurs : 3
 4.Base de donnée Mysql/Oracle (1994) 18 euros, nombre d'auteurs : 2
 5.Architecture des Ordinateurs (2004) 18 euros, nombre d'auteurs : 1
 6.Logique et Programmation Logique (2009) 18 euros, nombre d'auteurs : 4
 7.Developpement Web (2000) 18 euros, nombre d'auteurs : 2
 8.Réseau et Déploiment (2012) 18 euros, nombre d'auteurs : 1
 
Dunod ( 5 Livres)
 
 1. Comprendre XSLT (2002) 18 euros, nombre d'auteurs : 2
 2.Pratique de MYSQL et PHP (2003) 18 euros, nombre d'auteurs : 1
 3.Savoir Programmer (1988) 18 euros, nombre d'auteurs : 3
 4.Base de donnée Mysql/Oracle (1994) 18 euros, nombre d'auteurs : 2
 5.Architecture des Ordinateurs (2004) 18 euros, nombre d'auteurs : 1
 6.Logique et Programmation Logique (2009) 18 euros, nombre d'auteurs : 4
 7.Developpement Web (2000) 18 euros, nombre d'auteurs : 2
 8.Réseau et Déploiment (2012) 18 euros, nombre d'auteurs : 1
 
alors que le résultat devrait ressembler a ceci :
 
0'Reilly ( 3 Livres)
 
 1.Comprendre XSLT (2002) 18 euros, nombre d'auteurs : 2
 2.Pratique de MYSQL et PHP (2003) 33 euros, nombre d'auteurs : 1
 3.Savoir Programmer (1988) 14 euros, nombre d'auteurs : 3
 
 
Dunod ( 5 Livres)
 
 
 1.Base de donnée Mysql/Oracle (1994) 18 euros, nombre d'auteurs : 2
 2.Architecture des Ordinateurs (2004) 53 euros, nombre d'auteurs : 1
 3.Logique et Programmation Logique (2009) 13 euros, nombre d'auteurs : 4
 4.Developpement Web (2000) 23 euros, nombre d'auteurs : 2
 5.Réseau et Déploiment (2012) 10 euros, nombre d'auteurs : 1
 
S'il vous plait aidez moi  
MERCI

Reply

Marsh Posté le 18-06-2012 à 01:28:19   

Reply

Marsh Posté le 18-06-2012 à 03:13:12    

En modifiant le moins possible ton code:

Code :
  1. <?xml version="1.0" encoding="ISO-8859-1"?>
  2. <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  3.  <xsl:key name="ISBN" match="livre" use="@isbn"/>  
  4.  <xsl:template match="/">
  5.    <html>
  6.      <head>
  7.     <title>Exemple de sortie HTML</title>
  8.     <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
  9.      </head>
  10.      <body>
  11.     <xsl:for-each select="//editeur">  
  12.       <b>
  13.         <xsl:value-of select="@nom" /> (
  14.         <xsl:value-of select="count(isbn)" /> Livres)
  15.         <br/>
  16.       </b>
  17.       <ol><xsl:for-each select="isbn">
  18.         <xsl:call-template name="livre">
  19.         <xsl:with-param name="PRIX" select="@prix"/>
  20.         <xsl:with-param name="LIVRE" select="key('ISBN', text())"/>
  21.         </xsl:call-template>
  22.       </xsl:for-each>
  23.       </ol>
  24.     </xsl:for-each>
  25.      </body>
  26.    </html>
  27.  </xsl:template>
  28.  <xsl:template name="livre">
  29.    <xsl:param name="PRIX"/>  
  30.    <xsl:param name="LIVRE"/>  
  31.    <li><i><xsl:value-of select="$LIVRE/titre" /></i>
  32.    (<xsl:value-of select="$LIVRE/@annee" /> )
  33.    <xsl:value-of select="$PRIX" /> euros,
  34.    nombre d'auteurs : <xsl:value-of select="count($LIVRE/auteur)" /></li>  
  35.  </xsl:template>
  36. </xsl:stylesheet>


Testé avec Saxon, et ça donne la sortie que tu désires.  
J'ai écrit ça vite fait, il y a peut être plus élégant.
A+,


Message édité par gilou le 18-06-2012 à 03:18:43

---------------
There's more than what can be linked! --  Le capitaine qui ne veut pas obéir à la carte finira par obéir aux récifs. -- No jab ? No job ! -- (╯°□°)╯︵ ┻━┻
Reply

Marsh Posté le 18-06-2012 à 11:31:19    

Bon, maintenant que je suis réveillé, quelques commentaires:
 
<xsl:key name="ISBN" match="livre" use="@isbn"/>  
ça crée une sorte d'associative array, avec pour clé, la valeur de l'expression use dans le contexte du match, et comme valeur, une node list qui contiendra le match (et d'autres si on en rencontre plus tard avec la même valeur de clé).
 
<xsl:template name="livre">
    <xsl:param name="PRIX"/>  
    <xsl:param name="LIVRE"/>  
    ...
</xsl:template>
c'est comme une déclaration de fonction livre(PRIX, LIVRE) ou PRIX et LIVRE sont les deux parametres.
Dans le corps de la fonction, les paramètres sont représentés précédés d'un $: $LIVRE, $PRIX
 
<xsl:call-template name="livre">
        <xsl:with-param name="PRIX" select="@prix"/>
        <xsl:with-param name="LIVRE" select="key('ISBN', text())"/>
</xsl:call-template>
c'est comme l'appel de la fonction livre(@prix, key('ISBN', text()), ou la valeur des paramètres passés à l'appel est évaluée dans le contexte de l'appel.
 
Au vu de ton fichier xml, il était clair qu'on pouvait indexer les livres par leur valeur d'isbn, d'ou la déclaration de l'element xsl:key.
 
<xsl:for-each select="//editeur">  
  ...
  <xsl:for-each select="isbn">
  ...
  </xsl:for-each>
</xsl:for-each>
permet de traiter les livres pour chaque éditeur.
 
On est obligé de passer par un template nommé, car il faut des infos venant de deux contextes différents, celui des livres, et celui de l'éditeur, pour le prix.
Si on n'avait pas besoin du prix, un template normal de traitement des livres aurait suffi, <xsl:template match="livre">... avec un appel <xsl:apply-template select="key('ISBN', text())"/> à la place du template nommé.
 
 
A+,


Message édité par gilou le 18-06-2012 à 11:32:21

---------------
There's more than what can be linked! --  Le capitaine qui ne veut pas obéir à la carte finira par obéir aux récifs. -- No jab ? No job ! -- (╯°□°)╯︵ ┻━┻
Reply

Marsh Posté le 18-06-2012 à 11:59:19    

Y'aurait peut-être à revoir la structure du xml pour avoir toutes les infos nécessaires sous la balise <livre> pour que ça soit plus simple à traiter :/


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 18-06-2012 à 12:10:15    

Bonjour ,
 
Merci guilou pour ta réponse si rapide et si explicite .

Reply

Marsh Posté le 18-06-2012 à 12:13:47    

rufo a écrit :

Y'aurait peut-être à revoir la structure du xml pour avoir toutes les infos nécessaires sous la balise <livre> pour que ça soit plus simple à traiter :/

Parfois on n'a pas la maîtrise de ce genre de choses. Et c'est justement pour cela qu'il y a le xslt.
A+,


---------------
There's more than what can be linked! --  Le capitaine qui ne veut pas obéir à la carte finira par obéir aux récifs. -- No jab ? No job ! -- (╯°□°)╯︵ ┻━┻
Reply

Marsh Posté le 18-06-2012 à 12:48:55    

tout à fait, mais il n'a pas indiqué qu'il n'avait pas la maîtrise du xml...


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Sujets relatifs:

Leave a Replay

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