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 :

Questions XSLT [Débutant(e)]


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2012
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 69
    Points : 36
    Points
    36
    Par défaut Questions XSLT
    Bonjour,

    Je me sers du XSLT pour convertir un XML en un autre XML et je n'arrive pas à faire certaines choses,

    Voici quelques exemples :

    1) je dois transformer du xml de la forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <aa>12$13$14.5$15$</aa>
    en xml de la forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <aa>
    <b>12$</b>
    <b>13$</b>
    <b>14.5$</b>
    <b>15$</b>
    </aa>
    Mais comment itérer sur ma chaîne de caractères ?
    Et comment la découper comme il faut ?

    2) Je dois mettre une valeur mais qui dépend d'une autre :

    Si j'ai ça :
    dans le xml source

    Alors je dois mettre ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <aa name="b" value="valeur 1" aa>
    dans le xml de sortie.

    Si j'ai ça :
    je dois mettre ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <aa name="b" value="valeur 2" aa>
    Et ainsi de suite pour plusieurs valeurs (une dizaine).

    3) L'existence d'une balise xml avec un noeud texte non vide fait que je mets la valeur 1,
    et en cas d'absence je mets la valeur 0.

    Si j'ai :
    dans le xml source
    Alors je mets :
    dans le xml de sortie

    Par contre si j'ai :
    Alors je mets :
    4) Sinon je n'arrive pas à itérer sur un ensemble d'éléments.
    J'ai lu de la doc sur l'instruction for-each select ... mais ça ne marche pas, il ne rentre même pas une fois dans la boucle, comme si je n'avais aucun noeud du type donné.

    Voilà un modèle de mon xml source :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <root>
    <aa>
    <bb>
    <c>111</c>
    <c>222</c>
    <c>333</c>
    </bb>
    </cc>
    </root>
    Je cherche à itérer sur les balises <c> avec 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
    <?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" version="1.0" encoding="iso-8859-1" indent="yes"/>
    <xsl:template match="/root">
    <xsl:for-each select="aa/bb/c">
    <xsl:element name="myElement">
    <xsl:attribute name="value">
    <xsl:value-of select="text()" />
    </xsl:attribute>
    </xsl:element>
    </xsl:for-each>
    </xsl:template>
    </xsl:stylesheet>
    Déjà ça n'itère pas comme je m'y attends, ensuite l'instruction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:value-of select="text()" />
    n'est pas correcte je pense ...?

    Sinon l'instruction :
    sélectionne le noeud root mais alors pourquoi je ne peux pas remettre
    une instruction à l'intérieur ?
    Y'a un truc qui m'échappe avec le ...

    Voilà quelques problèmes que je n'arrive pas à faire.
    Merci beaucoup pour votre aide ou vos suggestions.

  2. #2
    Membre émérite
    Avatar de polymorphisme
    Homme Profil pro
    Publishing
    Inscrit en
    Octobre 2009
    Messages
    1 460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Publishing
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2009
    Messages : 1 460
    Points : 2 372
    Points
    2 372
    Par défaut
    Bonjour,

    1) tu peux consulter ce message pour obtenir une réponse : boucle-lettres-simples-multiples

    2) pour chaque élément b, tu crée <aa name="b" value="valeur de b +1 "/>
    tu crée un simple règle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <xsl:template select="b">
       <aa name="b" value="{number(.) + 1}"/>
    </xsl:template>
    3)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <xsl:template select="aa">
      <xsl:choose>
        <xsl:when select=". != ''">
            <aa value="1"/>
        </xsl:when>
        <xsl:otherwise>
           <aa value="0"/>
        <xsl:otherwise>
      </xsl:choose>
    </xsl:template>
    Note : tu peux aussi utiliser l'élément xsl:attribute.

    4) Si tu peux travail avec l'encodage UTF-8 plutôt que ISO-8859-1.

    Voici un petit exemple :
    Le fichier de données XML :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <?xml version="1.0" encoding="UTF-8"?>
     
    <root>
      <node>a first node</node>
      <node>a node</node>
      <node>a last node</node>
    </root>
    La feuille de style XSLT :

    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
    <?xml version="1.0" encoding="UTF-8"?>
     
    <xsl:stylesheet version="1.0"
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     
        <xsl:template match="/">
           <descriptions>
             <xsl:for-each select="//node">
                <description>
                    <position><xsl:value-of select="position()"/></position>
                    <name><xsl:value-of select="name()"/></name>
                    <content><xsl:value-of select="."/></content>
                </description>
             </xsl:for-each>
          </descriptions>        
        </xsl:template>
     
    </xsl:stylesheet>
    En ligne de commande, on obtient :

    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
    java org.apache.xalan.xslt.Process -in xsltForEach01.xml -xsl xsltForEach01.xsl
     
    <?xml version="1.0" encoding="UTF-8"?>
     
    <descriptions>
      <description>
        <position>1</position>
        <name>node</name>
        <content>a first node</content>
      </description>
      <description>
        <position>2</position>
        <name>node</name>
        <content>a node</content>
      </description>
      <description>
        <position>3</position>
        <name>node</name>
        <content>a last node</content>
      </description>
    </descriptions>

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2012
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 69
    Points : 36
    Points
    36
    Par défaut
    Bonsoir,
    Et merci beaucoup !

    J'ai réussi à faire les 2), 3) et 4)
    Par contre pour le 1) pas moyen vu que dans votre exemple ils sont sur xslt 2.0 mais moi j'utilise le 1.0

    Si quelqu'un a une autre méthode pour faire ça en utilisant que le 1.0 je veux bien.

    Bonne soirée

  4. #4
    Membre émérite
    Avatar de polymorphisme
    Homme Profil pro
    Publishing
    Inscrit en
    Octobre 2009
    Messages
    1 460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Publishing
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2009
    Messages : 1 460
    Points : 2 372
    Points
    2 372
    Par défaut
    Oui, en effet.

    Dans l'exemple que j'ai cité, tu remplace :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns:xs="http://www.w3.org/2001/XMLSchema"
        exclude-result-prefixes="xs"
        version="2.0">
    par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  
        version="1.0">
    Et je te laisse trouver le reste.
    La difficulté se trouve dans le fait que tu n'a pas appris le langage,
    et non pas à la nature du problème que tu dois résoudre.

  5. #5
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 567
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 567
    Points : 21 635
    Points
    21 635
    Par défaut
    Tout de même, en XSLT 1.0 ce genre de découpage de chaîne est difficile. Il n'y a que deux solutions : utiliser une extension EXSLT ou bien faire un template récursif qui grignote la chaîne petit bout par petit bout.

  6. #6
    Membre émérite
    Avatar de polymorphisme
    Homme Profil pro
    Publishing
    Inscrit en
    Octobre 2009
    Messages
    1 460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Publishing
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2009
    Messages : 1 460
    Points : 2 372
    Points
    2 372
    Par défaut
    Bonjour Thevin,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Tout de même, en XSLT 1.0 ce genre de découpage de chaîne est difficile.
    Désolé, je crois que je ne rends pas toujours compte de la difficulté;
    des réponses me viennent immédiatement en tête.

Discussions similaires

  1. [XSLT] Call-template question de débutant
    Par ben23 dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 14/07/2006, 00h20
  2. [XSLT] Question sur xsl et php
    Par mathis94 dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 15/05/2006, 10h50
  3. [XSLT][XPath] Questions diverses
    Par progamer54 dans le forum XSL/XSLT/XPATH
    Réponses: 11
    Dernier message: 10/05/2006, 12h19
  4. question xml / xslt pour tableau a 3 colonnes
    Par taybott dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 26/10/2005, 00h22
  5. [XSLT]Question sur le current()...
    Par Capt. Flame dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 24/10/2005, 14h29

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