[XML]-[XSL] tableau

tableau [XML]-[XSL] - XML/XSL - Programmation

Marsh Posté le 11-07-2005 à 17:35:24    

Bonjour,
je débute en xsl/xml
 
j'ai un fichier xml du genre
code:
<file>
      <file1 ext="bin" date="11 juillet"/>
      <file2 ext="doc" date="11 juillet"/>
      <file3 ext="toto" date="11 juillet"/>
</file>
 
J'aimerai créé un tableau avec 3 colonnes (file , ext, date)
Jy arrive mais le probleme est que le nombre de file (file1, file2,...)
dépend du fichier XML.(je voudrais créer un fichier XSL générique)
 
Quelqu'un peut m'aider.
merci

Reply

Marsh Posté le 11-07-2005 à 17:35:24   

Reply

Marsh Posté le 12-07-2005 à 15:14:28    

Faut générer les lignes de ton tableau dans un template qui sera appliqué pour chaque element qui dispose d'un attribut ext et date... c'est une expression xpath relativement simple à faire il me semble.


Message édité par avander le 12-07-2005 à 15:15:02
Reply

Marsh Posté le 12-07-2005 à 15:15:37    

A mon avis, c'est une grave erreur d'avoir des file1 file2 file3 :/
J'aurais plutôt mis :

<files>
  <file id="1">
    <ext>bin</ext>
    <date>11 juillet</date>
  </file>
</files>

Reply

Marsh Posté le 12-07-2005 à 15:52:38    

Oui mais la composition du fichier XML est arbitraire.
Je ne peux pas changer le fichier XML.

Reply

Marsh Posté le 12-07-2005 à 15:55:10    

Ah mince... C'est qui qui l'a fait qu'on le frappe ? :D

Reply

Marsh Posté le 13-07-2005 à 11:54:54    

Effectivement le coup du file1, file2, file3 c'est pas terrible... mais on peut s'en sortir!
 

<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<root>
<file>
      <file1 ext="bin" date="11 juillet"/>
      <file2 ext="doc" date="12 juillet"/>
      <file3 ext="toto" date="13 juillet"/>
</file>
</root>
<!-- eof -->


 

<?xml version="1.0" encoding="ISO-8859-1"?>
 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 
  <xsl:output
    method="xml" omit-xml-declaration="yes" indent="yes" encoding="ISO-8859-1"
    doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN"
    doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"/>
 
<xsl:template match="/">
  <html>
   <head />
   <body>
 
     <xsl:apply-templates />
   </body>
  </html>
</xsl:template>  
 
<xsl:template match="file">
  <h1>mon zoli tableau</h1>
  <table border="1">
    <tr><th>file</th><th>pos</th><th>ext</th><th>date</th></tr>
     
    <xsl:apply-templates />
  </table>
</xsl:template>  
 
<xsl:template match="*[@ext][@date]">
  <tr>
    <td><xsl:value-of select="name()" /></td>
    <td><xsl:value-of select="position()" /></td>
    <td><xsl:value-of select="@ext" /></td>
    <td><xsl:value-of select="@date" /></td>
  </tr>
</xsl:template>  
 
</xsl:stylesheet>  
<!-- eof -->


 
et le résultat ( en version texte only)

mon zoli tableau
file pos ext date
file1  2  bin  11 juillet
file2  4  doc  12 juillet
file3  6  toto  13 juillet


 
maintenant si quelqu'un voit pourquoi position() retourne la position relative * 2, je suis preneur...


Message édité par avander le 13-07-2005 à 11:56:36
Reply

Marsh Posté le 13-07-2005 à 11:57:37    

J'aurais fait ça un peu différemment ;)

Reply

Marsh Posté le 13-07-2005 à 11:57:42    

2 sec

Reply

Marsh Posté le 13-07-2005 à 12:07:39    


alors?  :whistle:

Reply

Marsh Posté le 13-07-2005 à 12:11:44    

Du calme, du calme :D

Reply

Marsh Posté le 13-07-2005 à 12:11:44   

Reply

Marsh Posté le 13-07-2005 à 12:21:38    

Bon, si <file> ne contient que des file1, file2, etc. (sinon j'ai aussi la solution pour s'assurer que c'est un filexxx) :

<?xml version="1.0" encoding="utf-8"?>
<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="xml"
  doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN"
  doctype-system="http://www.w3.org/TR/xhtml1/dtd/xhtml1-strict.dtd" />
  <xsl:template match="file">
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
   <head>
    <title>Tableau file</title>
   </head>
      <body>
        <table border="3">
          <thead>
            <tr>
              <tr><th>file</th><th>pos</th><th>ext</th><th>date</th></tr>
            </tr>
          </thead>
          <tbody>
            <xsl:for-each select="*">
              <tr>
                <td><xsl:value-of select="name()" /></td>
                <td><xsl:value-of select="position()" /></td>
                <td><xsl:value-of select="@ext" /></td>
                <td><xsl:value-of select="@date" /></td>
              </tr>
            </xsl:for-each>
          </tbody>
        </table>
      </body>
    </html>
  </xsl:template>
</xsl:transform>


Bon j'ai pas tout templatisé à mort, maispagrave :D

Reply

Marsh Posté le 13-07-2005 à 14:22:50    

belle illustration d'un article très intéressant sur le style push et pull d'un stylesheet sur www.xml.com
 
ma solution: push style
ta solution: pull style
 
 ;)

Reply

Marsh Posté le 13-07-2005 à 14:26:23    

:)
 
Sinon, autre version :

<?xml version="1.0" encoding="utf-8"?>
<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="xml"
  doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN"
  doctype-system="http://www.w3.org/TR/xhtml1/dtd/xhtml1-strict.dtd" />
  <xsl:template match="file">
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
   <head>
    <title>Tableau file</title>
   </head>
      <body>
        <table border="3">
          <thead>
            <tr>
              <tr><th>file</th><th>pos</th><th>ext</th><th>date</th></tr>
            </tr>
          </thead>
          <tbody>
            <xsl:apply-templates />
          </tbody>
        </table>
      </body>
    </html>
  </xsl:template>
  <xsl:template match="file/*[starts-with(name(),'file')]">
    <tr>
      <td><xsl:value-of select="name()" /></td>
      <td><xsl:value-of select="position()" /></td>
      <td><xsl:value-of select="@ext" /></td>
      <td><xsl:value-of select="@date" /></td>
    </tr>
  </xsl:template>
</xsl:transform>

Reply

Marsh Posté le 13-07-2005 à 14:34:03    

Je préfere la 2ième... for-each spa beau... une idée pour l'histoire de position() qui n'était pas demandé mais ça m'intrigue...
 
j'ai essayé avec  

<xsl:template match="*[@ext and @date]">

mais c'est pareil, il doit sélectionner autre chose mais je vois pas...


Message édité par avander le 13-07-2005 à 14:36:51
Reply

Sujets relatifs:

Leave a Replay

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