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

XML/XSL et SOAP Discussion :

xsl et boucles


Sujet :

XML/XSL et SOAP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Octobre 2007
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 27
    Par défaut xsl et boucles
    Bonjour,

    Je dois transformer un fichier xml vers un autre fichier xml
    la structure du premier :
    <entree>
    <test><terme>auteur</terme></test>
    <test><terme>contributeur</terme></test>
    </entree>
    <entree>
    <test><terme>etym</terme></test>
    <test><terme>auteur2</terme></test>
    <test><terme>contributeur2</terme></test>
    </entree>

    La structure que j'aimerais avoir
    <entree>
    <auteur>auteur</auteur>
    <contributeur>contributeur</contributeur>
    </entree>
    <entree>
    <etym>etym</etym>
    <auteur>auteur2</auteur>
    <contributeur>contributeur2</contributeur>
    </entree>


    Comment faire pour dire à XSL :
    - dans un cas si il y a 2 termes alors le 1er c'est... et le 2ème...
    - dans un autre cas si il y a 3 termes, alors le 1er c'est... etc
    Voilà, j'espère que je suis claire
    Merci

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

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

    Informations forums :
    Inscription : Octobre 2009
    Messages : 1 460
    Par défaut
    Bonjour venus02,

    on utilise XPath avec XSLT pour sélectionner les éléments XML
    que l'on souhaite manipuler.

    Pour sélectionner le second élément de type entree, on utilisera l'expression XPath :

    ce qui donne, avec l'écriture abrégée :

    Pour sélectionner la valeur auteur, on utilisera l'expression :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    entre[1]/test[1]/terme/text()

  3. #3
    Membre averti
    Inscrit en
    Octobre 2007
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 27
    Par défaut
    Merci, effectivement ce code fonctionne lorsqu'il n'y a que deux entrées, or mon fichier comporte plusieurs entrées, j'ai simplifié l'exemple de départ.

    c'est un problème de test sur le nombre de test/term dans chaque <entree>, selon le nombre de test/term par <entree>, le traitement est différent

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

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

    Informations forums :
    Inscription : Octobre 2009
    Messages : 1 460
    Par défaut
    pour dénombrer, tu peux utiliser la fonction count().

  5. #5
    Membre averti
    Inscrit en
    Octobre 2007
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 27
    Par défaut
    j'ai testé count, mais j'ai du faire une erreur, peux-tu analyser mon code ?
    <xsl:template match="entree">
    <xsl:element name="entree">
    <xsl:for-each select="test/terme">

    <xsl:if test="count(node()=2)">
    <xsl:if test="position()=1">
    <auteur><xsl:apply-templates/></auteur>
    </xsl:if>
    <xsl:if test="position()=2">
    <contributeur><xsl:apply-templates/></contributeur>
    </xsl:if>
    </xsl:if>
    <xsl:if test="count(node()=3)">
    <xsl:if test="position()=1">
    <etym><xsl:apply-templates/></etym>
    </xsl:if>
    <xsl:if test="position()=2">
    <auteur><xsl:apply-templates/></auteur>
    </xsl:if>
    <xsl:if test="position()=2">
    <contributeur><xsl:apply-templates/></contributeur>
    </xsl:if>
    </xsl:if>
    </xsl:for-each>
    </xsl:element>
    </xsl:template>

    réponse dans je transforme :
    Description: ValidationException: Cannot convert string "auteur" to a double - Cannot convert string "auteur" to a double

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    1 466
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 466
    Par défaut
    Hello,
    C'est ce bout de code qui n'est pas logique
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <xsl:for-each select="test/terme">
    <xsl:if test="count(node()=2)">
    Déjà, l'équalité doit se faire sur le count() et non sur node(), donc
    Et de tout façon ce n'est pas logique de faire ça car les noeuds "terme" ne sembent avoir qu'un noeud de type texte, car la structure en entrée c'est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <entree>
    <test><terme>auteur</terme></test>
    </entree>
    Il serait plus logique de faire ce test avant le "for-each" et il serait même encore plus propre d'utiliser des templates en utilisant des "mode" différents que de faire des for-each.

    Enfin la position et le nombre d'enfants ont elles vraiment un intéret dans ce traitement. Pour moi tu veux juste nommer les noeuds en fonction de leur valeur. Si c'est le cas, il y a bcp plus simple comme approche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <xsl:template match="test/terme">
    	<xsl:element name="{text()}">
    		<xsl:value-of select="text()"></xsl:value-of>
    	</xsl:element>
    </xsl:template>

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

Discussions similaires

  1. [XSL] problème boucle
    Par VolaiL dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 10/04/2006, 16h55
  2. [xsl-fo] Recuperation de valeurs dans une boucle
    Par serwol dans le forum XSL/XSLT/XPATH
    Réponses: 10
    Dernier message: 12/12/2005, 12h13
  3. [XSL] Accès à un noeud dans une boucle
    Par Trin dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 15/11/2005, 14h32
  4. [XSL] boucle et répétition
    Par enigma dans le forum XSL/XSLT/XPATH
    Réponses: 8
    Dernier message: 23/07/2005, 01h32
  5. [XSL]boucle imbriquée avec condition
    Par kor dans le forum XSL/XSLT/XPATH
    Réponses: 10
    Dernier message: 11/01/2005, 14h19

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