IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

XSL/XSLT/XPATH XML Discussion :

trucs et astuces XML


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre confirmé
    Avatar de grishka
    Inscrit en
    Janvier 2003
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 285
    Points : 499
    Points
    499
    Par défaut trucs et astuces XML
    AOUT 2004

    sujet :
    Soit un document xml dont on ne connait pas la structure. Quelle transformation faut-il appliquer pour obtenir tout le texte en majuscule (valeurs d'attributs comprises).
    Solution de GrandFather:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    <?xml version="1.0"?> 
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
     
      <xsl:output method="xml" indent="yes"/> 
     
      <xsl:template match="*"> 
       <xsl:copy> 
         <xsl:apply-templates select="*|@*|text()"/> 
       </xsl:copy> 
      </xsl:template> 
     
      <xsl:template match="@*"> 
       <xsl:attribute name="{name()}"> 
         <xsl:value-of select="translate(.,'abcdefghijklmnopqrstuvwxyz','ABCDEFGHIJKLMNOPQRSTUVWXYZ')"/>    
       </xsl:attribute> 
      </xsl:template> 
     
      <xsl:template match="text()"> 
        <xsl:value-of select="translate(.,'abcdefghijklmnopqrstuvwxyz','ABCDEFGHIJKLMNOPQRSTUVWXYZ')"/>    
      </xsl:template> 
     
    </xsl:stylesheet>
    remarques :
    Le but est évidemment de garder la même structure que le xml source. Ainsi le premier template permet de recopier les noeuds (on aurait pu aussi utiliser xsl:element, mais la solution aurait été plus longue!), le deuxième template recopie les attributs et transforme le texte en majuscule et le troisième transforme le texte en majuscule.
    La transformation en majuscule passe par l'utilisation de translate. Il n'y a pas d'autre moyen sauf écrire une extension.

  2. #2
    Membre confirmé
    Avatar de grishka
    Inscrit en
    Janvier 2003
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 285
    Points : 499
    Points
    499
    Par défaut
    DEFI SEPTEMBRE 2004

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    on dispose en entrée d'un fichier xml :
    <fichiers>
      <fichier nom="fic1"/>
      <fichier nom="fic2"/>
      <fichier nom="fic3"/>
      ....
      <fichier nom="ficN"/>
    </fichiers>
     
    Avec une transformation XSLT on souhaite afficher les noms de fichiers par groupes de M dans un tableau html à C colonnes. M et C étant des paramètres donnés.
     
    exemple N=11, M=3, C=3 :
     
    *************************
    * fic1  * fic4  * fic7  *
    * fic2  * fic5  * fic8  *
    * fic3  * fic6  * fic9  *
    *************************
    * fic10 *       *       *
    * fic11 *       *       *
    *       *       *       *
    *************************
    Solution de Grandfather :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    <?xml version="1.0"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     
       <xsl:output method="html"/>
     
       <xsl:variable name="M" select="5"/>
       <xsl:variable name="C" select="2"/>
     
       <xsl:template match="/">
          <html>
            <body>
               <table border="1">
                 <xsl:for-each select="//fichier[position() mod ($M * $C) = 1]">
                    <tr>
                      <xsl:for-each select=".|following-sibling::fichier[position() mod $M = 0 and position() &lt; $M * $C]">
                         <td>
                           <xsl:for-each select=".|following-sibling::fichier[position() &lt; $M]">
                              <xsl:value-of select="@nom"/><br/>
                           </xsl:for-each>
                         </td>
                      </xsl:for-each>
                      <xsl:if test="position() = last()">
                         <xsl:call-template name="cellules_vides">
                           <xsl:with-param name="nb" select="$C - ceiling(count(.|following-sibling::fichier) div $M)"/>
                         </xsl:call-template>
                      </xsl:if>
                </tr>
                 </xsl:for-each>
               </table>
            </body>
          </html>
       </xsl:template>
     
       <xsl:template name="cellules_vides">
          <xsl:param name="nb"/>
          <xsl:if test="$nb &gt;= 1">
             <td/>
            <xsl:call-template name="cellules_vides">
              <xsl:with-param name="nb" select="$nb - 1"/>
            </xsl:call-template>
       </xsl:if>      
       </xsl:template>
     
     
    </xsl:stylesheet>
    Solution de Erwy, plus concise mais moyennant une bidouille afin de garder une feuille XSLT bien formée. De plus elle ne gère pas les cellules vides :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
       <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
       <xsl:variable name="M" select="3"/>
       <xsl:variable name="C" select="4"/>
       <xsl:template match="/">
          <html>
             <head>
                <title/>
             </head>
             <body>
                <table>
                   <tbody>
                      <xsl:apply-templates select="//fichier"/>
                   </tbody>
                </table>
             </body>
          </html>
       </xsl:template>
       <xsl:template match="fichier">
          <xsl:if test="position() mod ($M * $C)=1">
             <xsl:text disable-output-escaping="yes">&lt;tr&gt;</xsl:text>
          </xsl:if>
          <xsl:if test="position() mod $M=1">
             <xsl:text disable-output-escaping="yes">&lt;td&gt;</xsl:text>
          </xsl:if>
          <xsl:value-of select="concat(@nom,';')"/>
          <xsl:if test="position() mod $M=0 or position()=last()">
             <xsl:text disable-output-escaping="yes">&lt;/td&gt;</xsl:text>
          </xsl:if>
          <xsl:if test="position() mod ($M * $C)=0  or position()=last()">
             <xsl:text disable-output-escaping="yes">&lt;/tr&gt;</xsl:text>
          </xsl:if>
       </xsl:template>
    </xsl:stylesheet>

Discussions similaires

  1. [Truc et Astuce] - Raccourci universel
    Par e040098k dans le forum Contribuez
    Réponses: 0
    Dernier message: 13/08/2007, 19h11
  2. Recherche trucs et astuces en C
    Par gwendal86 dans le forum Réseau
    Réponses: 20
    Dernier message: 22/10/2006, 11h37
  3. Astuces XML/XSLT
    Par haypo dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 25/06/2003, 08h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo