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 :

Fonction récursive sur position


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Futur Membre du Club
    Inscrit en
    Septembre 2010
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 7
    Points : 6
    Points
    6
    Par défaut Fonction récursive sur position
    Bonjour à tous,

    J'ai un petit problème qui semble simple, mais je n'arrive pas à le faire en XSLT malheureusement pour moi.

    Voici mon XML :

    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
     
    <FICHIER>
    	<LIGNE>
    		<DONNEE>AAA</DONNEE>
    		<DONNEE>NOM</DONNEE>
    		<DONNEE>PRENOM</DONNEE>
    		<DONNEE>DATE</DONNEE>
    		(...)
    	</LIGNE>
    	<LIGNE>
    		<DONNEE>BBB</DONNEE>
    		<DONNEE>MARTIN</DONNEE>
    		<DONNEE>PAUL</DONNEE>
    		<DONNEE>12/10/2013</DONNEE>
    		(...)
    	</LIGNE>
    	<LIGNE>
    		<DONNEE>CCC</DONNEE>
    		<DONNEE>MATIERE_NUM</DONNEE>
    		<DONNEE>MATIERE</DONNEE>
    		<DONNEE>DATE</DONNEE>
    		<DONNEE>NOTE</DONNEE>
    				(...)
    	</LIGNE>
    	<LIGNE>
    		<DONNEE>DDD</DONNEE>
    		<DONNEE>1</DONNEE>
    		<DONNEE>ANGLAIS</DONNEE>
    		<DONNEE>12/10/2013</DONNEE>
    		<DONNEE>12</DONNEE>
    				(...)
    	</LIGNE>
    	<LIGNE>
    		<DONNEE>DDD</DONNEE>
    		<DONNEE>2</DONNEE>
    		<DONNEE>MATH</DONNEE>
    		<DONNEE>12/10/2013</DONNEE>
    		<DONNEE>10</DONNEE>
    				(...)
    	</LIGNE>
    	<LIGNE>
    		<DONNEE>DDD</DONNEE>
    		<DONNEE>3</DONNEE>
    		<DONNEE>CHIMIE</DONNEE>
    		<DONNEE>12/10/2013</DONNEE>
    		<DONNEE>16</DONNEE>
    				(...)
    	</LIGNE>
    </FICHIER>
    Malheureusement celui-ci n'est pas bien structuré de base, et je ne peux pas l'arranger à la source.

    La Ligne AAA et CCC sont ici les libellés des données BBB et DDD respectivement.

    Ainsi j'aimerais arriver à un résultat du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    <CARNET>
    	<ELEVE>
    	<!--Nom_Element=DONNEE AAA attribut val=DONNEE BBB selon la position-->
    		<NOM val="MARTIN"/>
    		<PRENOM val="PAUL"/>
    	</ELEVE>
    	<MATIERE MATIERE_NUM="1" MATIERE="ANGLAIS" NOTE="12"/>
    	<MATIERE MATIERE_NUM="2" MATIERE="MATH" NOTE="10"/>
    	<MATIERE MATIERE_NUM="3" MATIERE="CHIMIE" NOTE="16"/>
    </CARNET>
    Il me faudrait associer le libellé de //LIGNE[DONNEE='AAA']/DONNEE[X] à //LIGNE[DONNEE='BBB']/DONNEE[X]
    et //LIGNE[DONNEE='CCC']/DONNEE[X] à toutes les lignes //LIGNE[DONNEE='DDD']/DONNEE[X].

    Je n'arrive pas à faire de fonction qui s'indexe sur X soit la position de ligne.
    Je pourrais le faire ligne par ligne, mais j'aimerais faire un travail propre ...

    • Auriez-vous un conseil ?
    • Dois-je passer par un for-each ?
    • Comment créer une fonction itérative sur la position ?


    Merci à tous !

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 51
    Points : 25
    Points
    25
    Par défaut
    Bonjour,

    (J'ai retrouvé mon "compte" principal sur Developpez.com entre temps).

    Pour l'instant j'ai l'instruction suivante :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <xsl:template match='/'>
    		<xsl:apply-templates select='FICHIER'/>
    	</xsl:template>
    	<xsl:template match="FICHIER">
    		<xsl:element name="ENTETE">
    			<xsl:variable name="Donnee1" select="LIGNE[DONNEE='AAA']/DONNEE"/>
    			<xsl:variable name="Donnee2" select="LIGNE[DONNEE='BBB']/DONNEE"/>
    			<xsl:element name="{$Donnee1}">
    				<xsl:attribute name="VAL"><xsl:value-of select="$Donnee2"/></xsl:attribute>
    			</xsl:element>
    		</xsl:element>
    	</xsl:template>
    Celle-ci ne me renvoi qu'à la première donnée, et je n'arrive pas à automatiser le traitement des noeuds.
    Et lorsque j'essai d'insérer un for-each, le résultat ne fonctionne pas. Je dois mal le faire je pense.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 51
    Points : 25
    Points
    25
    Par défaut
    Finalement j'ai réussi :

    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
    <?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:template match='/'>
    	<xsl:element name="CARNET">
    		<xsl:apply-templates select='FICHIER'/>
    		</xsl:element>
    	</xsl:template>
    	<xsl:template match="FICHIER">
    		<xsl:element name="ELEVE">
    			<xsl:for-each select="LIGNE[DONNEE='AAA']/DONNEE">
    				<xsl:element name="DONNEE">
    					<xsl:variable name="pos" select="position()"/>
    					<xsl:attribute name="NOM"><xsl:value-of select="node()"/></xsl:attribute>
    					<xsl:attribute name="VAL"><xsl:value-of select="//LIGNE[DONNEE='BBB']/DONNEE[position() = $pos]"/></xsl:attribute>
    				</xsl:element>
    			</xsl:for-each>
    		</xsl:element>
    		<xsl:apply-templates select="LIGNE[DONNEE='DDD']"/>
    	</xsl:template>
    	<xsl:template match="LIGNE[DONNEE='DDD']">
    		<xsl:element name="MATIERE">
    			<xsl:apply-templates select="DONNEE"/>
    		</xsl:element>
    	</xsl:template>
    	<xsl:template match="DONNEE">
    		<xsl:element name="DONNEE">
    			<xsl:variable name="pos" select="position()"/>
    			<xsl:attribute name="NOM"><xsl:value-of select="//LIGNE[DONNEE='CCC']/DONNEE[position() = $pos]"/></xsl:attribute>
    			<xsl:attribute name="VAL"><xsl:value-of select="node()"/></xsl:attribute>
    		</xsl:element>
    	</xsl:template>
    </xsl:stylesheet>

    C'est très LENT mais fonctionnel.

  4. #4
    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 crains que cette "solution" contournée une fonctionalité que cet exercice veuille vous faire faire, viz, la fontionalité du "lookup" qui détermine les noms des éléments et des attributs au temps d'execution au lieu de donnée préalablement.

    Voici ce qu'on peut faire pour démontrer cette fonctionalité.
    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
    <xsl:template match="FICHIER">
        <xsl:element name="ELEVE">
            <xsl:for-each select="LIGNE[DONNEE[1]='AAA']/DONNEE[position() &gt; 1]">
                <xsl:variable name="p" select="position()+1" />
                <xsl:if test="normalize-space() != 'DATE'">
                    <xsl:element name="{text()}">
                        <xsl:value-of select="../../LIGNE[DONNEE[1]='BBB']/DONNEE[$p]" />
                    </xsl:element>
                </xsl:if>
            </xsl:for-each>
        </xsl:element>
        <xsl:for-each select="LIGNE[DONNEE[1]='DDD']">
            <xsl:element name="MATIERE">
                <xsl:for-each select="DONNEE[position() &gt; 1]">
                    <xsl:variable name="p" select="position()+1" />
                    <xsl:if test="normalize-space(../../LIGNE[DONNEE[1]='CCC']/DONNEE[$p]) != 'DATE'">
                        <xsl:attribute name="{../../LIGNE[DONNEE[1]='CCC']/DONNEE[$p]}">
                            <xsl:value-of select="." />
                        </xsl:attribute>
                    </xsl:if>
                </xsl:for-each>
            </xsl:element>
        </xsl:for-each>
    </xsl:template>

Discussions similaires

  1. Fonction récursive sur fichiers table
    Par castorameur dans le forum SAGE
    Réponses: 2
    Dernier message: 05/05/2015, 08h52
  2. Fonction récursive sur le parcours d'une arborescence
    Par MINNIEandMICKEY dans le forum Général Java
    Réponses: 4
    Dernier message: 24/12/2014, 10h34
  3. Fonction récursives sur tableaux indeterminés
    Par Zangdaarr dans le forum Débuter avec Java
    Réponses: 6
    Dernier message: 10/01/2011, 10h06
  4. fonction récursive sur string
    Par Jasmine80 dans le forum Langage
    Réponses: 18
    Dernier message: 15/07/2008, 10h09
  5. Fonction récursive renvoi sur page d'erreur
    Par peck dans le forum Langage
    Réponses: 1
    Dernier message: 23/12/2005, 10h08

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