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 :

[XSLT] transformation XHTML->XML


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    yos
    yos est déconnecté
    Membre du Club
    Inscrit en
    Mai 2005
    Messages
    140
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 140
    Points : 60
    Points
    60
    Par défaut [XSLT] transformation XHTML->XML
    Salut tout le monde,
    je débute dans l'xml, je dois écrir un xslt pour extraire des donnés et transformer un xhtml en xml valide:
    ma question est de savoir si il est possible à partir d'un simple tableau de pointer directement sur le text qand les balises n'ont pas de mot clé significatif exemple:

    la source xhtml :

    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
    - <table border="1" cellpadding="4" cellspacing="0" id="LISTE">
    - <tr valign="top">
    - <td nowrap="nowrap" >
      <b>Tour de poignet</b> 
      </td>
    - <td nowrap="nowrap" >
      <b>Taille</b> 
      </td>
    - <td nowrap="nowrap" >
      <b>Coloris</b> 
      </td>
    - <td nowrap="nowrap" >
      <b>Référence</b> 
      </td>
      </tr>
    - <tr valign="top" >
      <td nowrap="nowrap">13-15 cm</td> 
      <td nowrap="nowrap">1</td> 
      <td nowrap="nowrap">noir</td> 
      <td nowrap="nowrap">7500237</td> 
      </tr>
    - <tr valign="top" >
      <td nowrap="nowrap">15-16.5 cm</td> 
      <td nowrap="nowrap">2</td> 
      <td nowrap="nowrap">noir</td> 
      <td nowrap="nowrap">7500243</td> 
      </tr>
    - <tr valign="top" >
      <td nowrap="nowrap">16.5-18.5 cm</td> 
      <td nowrap="nowrap">3</td> 
      <td nowrap="nowrap">noir</td> 
      <td nowrap="nowrap">7500266</td> 
      </tr>
    - <tr valign="top" >
      <td nowrap="nowrap">18.5-20 cm</td> 
      <td nowrap="nowrap">4</td> 
      <td nowrap="nowrap">noir</td> 
      <td nowrap="nowrap">7500272</td> 
      </tr>
      </table>
    Question:
    comment faire pour arriver à un résultat qui ressemblerait à:
    <item tour-de-poingnet="13-15 cm" taille="1" coloris="noir" reference="4500237"</item>.../*la même chose pour le reste*/

    merci pour votre aide

  2. #2
    Membre expérimenté
    Avatar de virgul
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 625
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 625
    Points : 1 666
    Points
    1 666
    Par défaut
    Salut,

    pour commencer es-ce que tu es sur que c'est du XHTML et que ton document est bien formé (toujours une balise fermante pour un qui s'ouvre)?


    ++

    Thierry
    "Life is short don't forget to inhale"
    Mais: "Mieux vaux arriver en retard dans ce monde... qu'en avance à l'autre."

  3. #3
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Bonjour,

    la solution serait de créer chaque attribut en allant chercher son nom dans la 1ère ligne du tableau et dans la cellule du même rang. Une difficulté supplémentaire est de s'assurer que le nom de l'attribut est correct, avec des tirets à la place des espaces entre les mots. Ca donnerait un truc du genre (pas testé) :

    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
    ...
    <xsl:apply-templates select="table/tr[position() &gt; 1]"/>
    ...
    <xsl:template match="tr">
      <xsl:element name="item">
        <xsl:apply-templates select="td"/>
      </xsl:element>
    </xsl:template>
     
    <xsl:template match="td">
      <xsl:variable name="indice" select="position()"/>
      <xsl:attribute name="{translate(normalize-space(../../tr[1]/td[$indice]), ' ', '-')}">
        <xsl:value-of select="."/>
      </xsl:attribute>
    </xsl:template>
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  4. #4
    yos
    yos est déconnecté
    Membre du Club
    Inscrit en
    Mai 2005
    Messages
    140
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 140
    Points : 60
    Points
    60
    Par défaut
    Pour virgul,
    j'ai utilsé Tidy pour le normaliser et j'arrive à l'ouvrir avec les éditeur xml comme "editml.exe" par exemple donc normalement c'est valid

  5. #5
    yos
    yos est déconnecté
    Membre du Club
    Inscrit en
    Mai 2005
    Messages
    140
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 140
    Points : 60
    Points
    60
    Par défaut
    Grandfather,
    Ta reponse est très pertinente merci beaucoup,
    j'arrive à avoir un résultat très encouragent

    j'ai remplacé 1 par 2 dans j'ai réussi à extraire la première ligne seulement comment faire pour extraire le reste?

    resultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    - <tableau>
      <item Tour-de-poignet="Tour de poignet" Taille="Taille" Coloris="Coloris" Référence="Référence" /> 
      <item Tour-de-poignet="13-15 cm" Taille="1" Coloris="noir" Référence="7500237" /> 
      </tableau>
    merci encore pour ton aide
    merci,
    Yos

  6. #6
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Le résultat que tu obtiens ne me semble pas très cohérent...
    Qu'as-tu mis exactement dans l'attribut "select" du <xsl:apply-templates> qui appelle le template "tr" ?
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  7. #7
    yos
    yos est déconnecté
    Membre du Club
    Inscrit en
    Mai 2005
    Messages
    140
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 140
    Points : 60
    Points
    60
    Par défaut
    GrandFather,
    Voilà ce que j'ai mis:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:template match="body/form/table/tr[position() &gt; 2]"/>
    car
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:apply-templates select="table/tr[position() &gt; 1]"/>
    na pas fonctionné
    merci

  8. #8
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Il y a confusion entre <xsl:apply-templates>, qui appelle les templates des noeuds sélectionnés dans son attribut "select", et <xsl:template>, qui définit un template.

    Une feuille de style plus complète devrait avoir cette forme :

    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
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     
    <xsl:template match="/html">
      <tableau>
        <xsl:apply-templates select="body/form/table/tr[position() &gt; 1]"/>
      </tableau>
    </xsl:template>
     
    <xsl:template match="tr"> 
      <xsl:element name="item"> 
        <xsl:apply-templates select="td"/> 
      </xsl:element> 
    </xsl:template> 
     
    <xsl:template match="td"> 
      <xsl:variable name="indice" select="position()"/> 
      <xsl:attribute name="{translate(normalize-space(../../tr[1]/td[$indice]), ' ', '-')}"> 
        <xsl:value-of select="."/> 
      </xsl:attribute> 
    </xsl:template>   
     
    </xsl:stylesheet>
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  9. #9
    yos
    yos est déconnecté
    Membre du Club
    Inscrit en
    Mai 2005
    Messages
    140
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 140
    Points : 60
    Points
    60
    Par défaut
    voici tout le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <xsl:template match="body/form/table/tr[position() &gt; 2]"/> 
     
     <xsl:template match="tr"> 
        <xsl:element name="item"> 
          <xsl:apply-templates select="td"/> 
        </xsl:element> 
     </xsl:template> 
     
    <xsl:template match="td"> 
      <xsl:variable name="indice" select="position()"/> 
      <xsl:attribute name="{translate(normalize-space(../../tr[1]/td[$indice]), ' ', '-')}"> 
        <xsl:value-of select="."/> 
      </xsl:attribute> 
    </xsl:template>
    merci

  10. #10
    yos
    yos est déconnecté
    Membre du Club
    Inscrit en
    Mai 2005
    Messages
    140
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 140
    Points : 60
    Points
    60
    Par défaut
    Pardon j'ai oublié de préciser que mon xhtml contient d'autre infos
    j'ai coupé juste la partie tableau que j'ai eu du mal à normaliser

    voici tout le code:
    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
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    <?xml version="1.0" encoding="ISO-8859-1" ?> 
     
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     
     
      <xsl:template match="/">
        <doc>
          <xsl:apply-templates/>
        </doc>
      </xsl:template>
     
      <xsl:template match="head"/>
     
      <xsl:template match="body/form/table[@id='LIGNE']">
       <ligne/>
      </xsl:template>
     
      <xsl:template match="body/form/table[@id='LISTE'][@border='0']/tr/td">
        <cellule><xsl:apply-templates/></cellule>
      </xsl:template>
     
      <xsl:template match="body/form/table[@id='LISTE'][@border='1']">
        <tableau><xsl:apply-templates/></tableau>
      </xsl:template>
     
     
     <xsl:template match="body/form/table/tr[position() &gt; 2]"/> 
     
     <xsl:template match="tr"> 
        <xsl:element name="item"> 
          <xsl:apply-templates select="td"/> 
        </xsl:element> 
     </xsl:template> 
     
    <xsl:template match="td"> 
      <xsl:variable name="indice" select="position()"/> 
      <xsl:attribute name="{translate(normalize-space(../../tr[1]/td[$indice]), ' ', '-')}"> 
        <xsl:value-of select="."/> 
      </xsl:attribute> 
    </xsl:template>
     
     
     
     
      <xsl:template match="img">
         <xsl:choose>
           <xsl:when test="@src='images/28b01066.gif'"><puce/></xsl:when>
           <xsl:otherwise>  
             <image>
             <xsl:attribute name="adresse"><xsl:value-of select="@src"/></xsl:attribute>
           </image>
           </xsl:otherwise>  
         </xsl:choose>
      </xsl:template>
     
      <xsl:template match="span[@id='TITRE']">
         <titre><xsl:value-of select="b"/></titre>
      </xsl:template>
     
    </xsl:stylesheet>
    merci encore

  11. #11
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Ce n'est pas bon du tout !

    Comme je l'ai dit, il y a confusion entre deux balises XSL qui n'ont pas du tout le même rôle. La ligne en cause :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:template match="body/form/table/tr[position() &gt; 2]"/>
    Elle définit un template vide (donc qui ne fait rien) pour toutes les lignes des tableaux au delà de la deuxième, ce qui explique que tu n'obtiennes qu'une seule ligne du tableau en sortie.

    Prends le code que j'ai posté, et adapte-le éventuellement à tes besoins. Il va falloir aussi sérieusement songer à apprendre les fondamentaux de XSLT.
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  12. #12
    yos
    yos est déconnecté
    Membre du Club
    Inscrit en
    Mai 2005
    Messages
    140
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 140
    Points : 60
    Points
    60
    Par défaut
    Merci encore,
    j'ai corrigé le code et le résultat obtenu est très concluent:
    code partie tableau:
    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
    <xsl:template match="body/form/table[@id='LISTE'][@border='1']">
        <tableau><xsl:apply-templates select="tr[position() &gt; 1]"/></tableau>
      </xsl:template>
     
     
    <xsl:template match="tr"> 
      <xsl:element name="item"> 
        <xsl:apply-templates select="td"/> 
      </xsl:element> 
    </xsl:template> 
     
    <xsl:template match="td"> 
      <xsl:variable name="indice" select="position()"/> 
      <xsl:attribute name="{translate(normalize-space(../../tr[1]/td[$indice]), ' ', '-')}"> 
        <xsl:value-of select="."/> 
      </xsl:attribute> 
    </xsl:template>
    merci encore GrandFather

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XSLT] Transformer deux fichiers XML avec un seul Stylesheet
    Par sylvie dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 26/08/2010, 14h23
  2. [XSLT] Transformer un Document XML
    Par merlinerick dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 24/05/2009, 17h16
  3. Réponses: 2
    Dernier message: 10/04/2007, 11h46
  4. [XSLT]transformer un fichier XML en en fichier XML
    Par alexandra dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 16/08/2006, 14h26
  5. [XHTML] transformation xhtml en xml
    Par emma des bois dans le forum XML/XSL et SOAP
    Réponses: 3
    Dernier message: 16/06/2006, 10h59

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