[XSLT] cas concret

cas concret [XSLT] - XML/XSL - Programmation

Marsh Posté le 05-02-2005 à 14:52:40    

Je débute en XML, et rebute sur le XSLT.
j'ai fait le tour des tutos, mais je ne trouve pas de solution,
et comme des lignes de codes valent mieux qu'un long discours...
 
XML:

Code :
  1. <?xml version="1.0" encoding="ISO-8859-1"?>
  2. <source>
  3. <consoles>
  4.   <console id="1">
  5.    <nom>x-box</nom>
  6.    <fabricant>2</fabricant>
  7.    <support>dvd-rom</support>
  8.   </console>
  9.   <console id="2">
  10.    <nom>playstation</nom>
  11.    <fabricant>1</fabricant>
  12.    <support>cd-rom</support>
  13.   </console>
  14.   <console id="3">
  15.    <nom>playstation 2</nom>
  16.    <fabricant>1</fabricant>
  17.    <support>dvd-rom</support>
  18.   </console>
  19.   <console id="4">
  20.    <nom>game cube</nom>
  21.    <fabricant>3</fabricant>
  22.    <support>mini dvd</support>
  23.   </console>
  24. </consoles>
  25. <fabricants>
  26.   <fabricant id="1">
  27.    <nom>sony</nom>
  28.   </fabricant>
  29.   <fabricant id="2">
  30.    <nom>microsoft</nom>
  31.   </fabricant>
  32.   <fabricant id="3">
  33.    <nom>nintendo</nom>
  34.   </fabricant>
  35. </fabricants>
  36. </source>


mon XSL est à modifier:

Code :
  1. <?xml version="1.0" encoding="ISO-8859-1"?>
  2. <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  3. <xsl:output method="html"/>
  4. <xsl:template match="fabricants/fabricant">
  5. <ul>
  6.   <xsl:value-of select="nom"/> : <xsl:call-template name="articles"/>
  7. </ul>
  8. </xsl:template>
  9. <xsl:template name="articles">
  10. <xsl:value-of select="/source/consoles/console[fabricant='1']"/>     <!-- erreur en mettant @id à la place de 1 -->
  11. </xsl:template>
  12. </xsl:stylesheet>


 
le résultat attendu serait quelque chose qui ressemble à ca :

Code :
  1. <ul>
  2. <li>sony: playstation 1, playstation 2</li>
  3. <li>microsoft: x-box</li>
  4. <li>nintendo: game cube</li>
  5. </ul>


mais je n'arrive pas à afficher les articles de chaque fabricants.


Message édité par oirom le 10-02-2005 à 14:53:32
Reply

Marsh Posté le 05-02-2005 à 14:52:40   

Reply

Marsh Posté le 05-02-2005 à 17:21:32    

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="html"/>
    <xsl:key name="getConsoleByFabricant" use="fabricant/text()" match="//console"/>
    <xsl:template match="/">
        <ul>
            <xsl:apply-templates select="//fabricants/fabricant"/>
        </ul>
    </xsl:template>
    <xsl:template match="fabricant">
        <li>
            <xsl:value-of select="nom"/> : <xsl:apply-templates select="key('getConsoleByFabricant', @id)"/>
        </li>
    </xsl:template>
    <xsl:template match="console">
        <xsl:value-of select="nom"/>
        <xsl:if test="position() != last()">, </xsl:if>
    </xsl:template>
</xsl:stylesheet>

Reply

Marsh Posté le 08-02-2005 à 22:08:31    

merci beaucoup,
c'est exactement ce que je cherchais :jap:


Message édité par oirom le 08-02-2005 à 22:08:54
Reply

Marsh Posté le 10-02-2005 à 15:09:58    

je commence à comprendre, mais je bloque de nouveau, :(  
je voudrais maintenant un résultat comme ceci:
(meme source xml mais avec des elements <console> en plus)

Code :
  1. <ul>
  2.   <li>sony:
  3.     <ul>
  4.       <li>cd-rom: playstation 1</li>
  5.       <li>dvd-rom: playstation 2, playstation 3</li>
  6.     </ul>
  7.   </li>
  8.   <li>microsoft:
  9.     <ul>
  10.       <li>dvd-rom: x-box</li>
  11.     </ul>
  12.   </li>
  13.   <li>nintendo:
  14.     <ul>
  15.       <li>mini dvd: game cube</li>
  16.       <li>carte memoire: nes, supernes, nintendo64, gameboy</li>
  17.     </ul>
  18.   </li>
  19. </ul>


la méthode que j'ai trouvé fonctionne avec une nouvelle <key>
et ceci : <xsl:for-each select="/console[generate-id(.)=generate-id(key('key', yyy))]/xxx">
mais je n'arrive pas à l'appliquer correctement

Reply

Sujets relatifs:

Leave a Replay

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