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 :

Boucle for each ou template méthode [XSLT 1.0]


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 646
    Points : 240
    Points
    240
    Par défaut Boucle for each ou template méthode
    Bonjour,

    Désolé pour la prose . Je suis débutant en xslt et je souhaiterai juste une correction de mon code, celui-ci fonctionne.

    J'ai un fichier XML structuré ainsi, ce fichier est fourni par un soft tiers, je ne peux pas modifier la structure du xml:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    		<ElementA attributElA="unechaine">
    			<ElementB>
    				<ElementC1>IndexRechercher</ElementC1>
    				<ElementC2>ValeurACopier</ElementC2>
    			</ElementB>
    			<ElementB>
    				<ElementC1>IndexNonrechercher</ElementC1>
    				<ElementC2>ValeurAIgnorer</ElementC2>
    			</ElementB>
    J'ai 1 à n élément ElementA.
    Dans chaque ElementA, j'ai 1 à n élément ElementB.
    Dans chaque ElementB, j'ai uniquement et toujours 2 éléments nommés ElementC1 et ElementC2

    Je souhaite récupérer un fichier plat contenant:
    - l'attribut attributElA des éléments ElementA
    et
    - la valeur de l'élément ElementC2.
    Ce binôme ne doit être récupérer que si ElementC1 est égale à une certaine valeur.


    Voici ma méthode:
    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" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    	<xsl:output method="text"/>
     
    	<xsl:template match="/">
     
    	<xsl:for-each select="ElementA">
     
    	<xsl:variable name="myElement" select="."/>
     
    		<xsl:for-each select="ElementB">
     
    			<xsl:if test="ElementC1='IndexRechercher'">
     
    				<xsl:value-of select="$myElement/@attributElA"/>
    				<xsl:value-of select="ElementC2"/>
     
    			</xsl:if>			
    		</xsl:for-each>
    	</xsl:for-each>
    	</xsl:template>
    </xsl:stylesheet>
    Cela fonctionne chez moi, et j'ai le résultat souhaité. C'est juste que j'aimerai améliorer mes connaissances et avoir vos critiques sur mon script, je ne suis pas sur d'avoir bien compris le fonctionnement de la variable par exemple et si je l'utilise bien.

    Merci

  2. #2
    Membre émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    Par défaut
    Je m'en doute que ça marche sans toutefois préciser un peu plus que je suis sûr vous vous avez juste épargné de le faire ici.
    J'ai 1 à n élément ElementA.
    On peut déduire donc ElementA ne peut pas être la racine du document et en tout cas il doit y avoir une élément englobant des éléments A. En conséquence, ceci
    <xsl:template match="/">
    <xsl:for-each select="ElementA">
    ne peut pas marcher. Si le parent des ElementA est la racine du document, il doit être au moins comme ça pour qu'il marche.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <xsl:template match="/racine">
    	<xsl:for-each select="ElementA">
    A part ça, le template est bien propre : si on veut critiquer, il manque un peu de mis-en-forme plus raisonable pour les sorties, et puis, je préfererais un peu plus de mettre la variable directement l'attribut au lieu de l'élément lui-même.
    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="/racine">
        <xsl:for-each select="ElementA">
            <xsl:variable name="myAttribute" select="@attributElA"/>
            <xsl:for-each select="ElementB">
                <xsl:if test="ElementC1='IndexRechercher'">
                    <xsl:value-of select="$myAttribute"/>
                    <xsl:text>, </xsl:text>
                    <xsl:value-of select="ElementC2"/>
                    <!-- nouvelle ligne style windows, sinon on s'adapte un peu -->
                    <xsl:text>&#x0d;&#x0a;</xsl:text>
                </xsl:if>			
            </xsl:for-each>
        </xsl:for-each>
    </xsl:template>

  3. #3
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Je dirais aussi que le if n'est pas nécessaire et reflète le manque d'habitude des prédicats :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <xsl:for-each select="ElementB">
      <xsl:if test="ElementC1='IndexRechercher'">
        <!-- traitement -->
      </xsl:if>
      <!-- et rien d'autre -->
    </xsl:for-each>
    s'écrirait plutôt :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <xsl:for-each select="ElementB[ElementC1 = 'IndexRechercher']">
      <!-- traitement -->
    </xsl:for-each>
    Mais bon, c'est pas super important non plus.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 646
    Points : 240
    Points
    240
    Par défaut
    Bonjour,
    Merci pour vos commentaires, j'ai amélioré mon script!
    a+

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

Discussions similaires

  1. [VBA-E]PB sur une boucle for each next
    Par rond24 dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 31/07/2006, 15h47
  2. aide vba boucle for each paramétrée en range
    Par gotlieb dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 27/07/2006, 08h55
  3. [VBA-E] erreur boucle for each
    Par Mut dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 15/02/2006, 16h38
  4. [xslt] For-each dans template avec format XML (row)
    Par Steff1985 dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 17/11/2005, 11h14
  5. Boucle For each
    Par roots_man dans le forum ASP
    Réponses: 10
    Dernier message: 18/02/2005, 09h55

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