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

  FORUM HardWare.fr
  Programmation
  XML/XSL

  XSLT

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

XSLT

n°2146156
billouxs
Posté le 18-06-2012 à 01:28:19  profilanswer
 

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

mood
Publicité
Posté le 18-06-2012 à 01:28:19  profilanswer
 

n°2146158
gilou
Modérateur
Modzilla
Posté le 18-06-2012 à 03:13:12  profilanswer
 

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! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2146214
gilou
Modérateur
Modzilla
Posté le 18-06-2012 à 11:31:19  profilanswer
 

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! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2146219
rufo
Pas me confondre avec Lycos!
Posté le 18-06-2012 à 11:59:19  profilanswer
 

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
n°2146222
billouxs
Posté le 18-06-2012 à 12:10:15  profilanswer
 

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

n°2146223
gilou
Modérateur
Modzilla
Posté le 18-06-2012 à 12:13:47  profilanswer
 

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! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2146230
rufo
Pas me confondre avec Lycos!
Posté le 18-06-2012 à 12:48:55  profilanswer
 

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

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

  XSLT

 

Sujets relatifs
XSLT / XML : position d'un noeudModifier le fichier xml avec un feuille XSLT
[XSLT] déclaration de namespace et localisation attributtransformation du fichier XML vers TEX avec XSLT
Transformer du XML en WSDL avec XSLT ?Servlet +xml+xslt => flux rss = problèmes
XSLT: utilisation de la fonction position() dans <for-each> imbriqués[XSLT 2.0] Récupérer le PATH d'un élément //LINE
Débutant XSLTXSLT somme par type de produit
Plus de sujets relatifs à : XSLT


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