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 :

Recursivité pour construire une hiérarchie


Sujet :

XSL/XSLT/XPATH XML

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Mai 2002
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 94
    Par défaut Recursivité pour construire une hiérarchie
    Bonjour,
    Je dois construire une hererchie imbriquée, à partir d'une structure a seulement deux niveaux pere - fils.

    Une des difficultés que je rencontre est d'identifier le premier niveau car il n'y a pas de balise ou d'attribut particulier pour l'identifier.
    Voici la structre, en exemple:

    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
     
    <events>
    	<event>
    		<father>A11111</father>
    		<sons>
    			<son>B22222</son>
    			<son>B33333</son>
    			<son>B44444</son>
    		</sons>
    	</event>
     
    	<event>
    		<father>B22222</father>
    		<sons>
    			<son>C22222</son>
    			<son>C33333</son>
    			<son>C44444</son>
    		</sons>
    	</event>
     
    	<event>
    		<father>B33333</father>
    		<sons>
    			<son>D22222</son>
    			<son>D33333</son>
    			<son>D44444</son>
    		</sons>
    	</event>
    </events>
    Et le résultat que je cherche à obtenir:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    <container id="A11111">
    	<container id="B22222">
    		<item>C22222</item>
    		<item>C33333</item>
    		<item>C44444</item>
    	</container>
    	<container id="B33333">
    		<item>D22222</item>
    		<item>D33333</item>
    		<item>D44444</item>
    	</container>
    	<item>B44444</item>
    </container>
    Sachant que les balises events ne sont pas forcément ordonnées dans l'ordre de la hierarchie, evidemment...
    je comprend bien qu'il faut faire une structure recursive, mais je ne sais pas comment identifier

    je suis parti sur un apply template:

    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
     
    <xsl:template match="events">
        <xsl:apply-templates select="event"/>
    <xsl:template/>
     
    <xsl:template match="event">
    		<container>
    			<xsl:value-of select="father"/> <!-- Comment identifier que c'est la structure de plus haut niveau ? -->
    		</container>
    		<xsl:for-each select="sons/son">
    			<!-- identifier si le fils a des fils, si non -->
    			<item><xsl:value-of select="."/></item>
    			<!-- si oui, recursivité sur l'element -->
    			<xsl:apply-templates select="."/>
    		</xsl:for-each>
    </xsl:template>
    mais la je suis bloqué...

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Hello,

    A première vue, ceux de plus haut niveau, c'est ceux qui ne sont fils de personne.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre confirmé
    Inscrit en
    Mai 2002
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 94
    Par défaut
    Bon, je réussis deja a afficher le pere sans fils:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    <xsl:template match="events">
    		<xsl:for-each select="event">
    			<xsl:variable name="fatherid"><xsl:value-of select="father"/></xsl:variable>
    			<xsl:if test="not(../event[sons/son = $fatherid])">
    				<f><xsl:value-of select="$fatherid"/></f>
    			</xsl:if>
    		</xsl:for-each>
    	</xsl:template>

  4. #4
    Membre confirmé
    Inscrit en
    Mai 2002
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 94
    Par défaut
    Bon, bah voila ma solution.
    Ce n'est peut etre pas la plus élégante mais ca fonctionne

    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
     
    <xsl:stylesheet version="1.0"
    	xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     
    	<xsl:output method="xml" indent="yes"/>
     
    	<xsl:template match="events">
    		<xsl:for-each select="event">
    			<xsl:variable name="fatherid"><xsl:value-of select="father"/></xsl:variable>
    			<!-- On commence avec les peres absolus => Trouver les peres qui ne sont pas fils -->
    			<xsl:if test="not(../event[sons/son = $fatherid])">
    				<xsl:apply-templates select="."/>
    			</xsl:if>
    		</xsl:for-each>
    	</xsl:template>
     
    	<xsl:template match="event">
    		<!-- Afficher le pere en tant que CTN -->
    		<container>
    			<xsl:attribute name="id"><xsl:value-of select="father"/></xsl:attribute>
    			<!-- Pour chaque fils -->
    			<xsl:for-each select="sons/son">
    				<xsl:variable name="sonid"><xsl:value-of select="."/></xsl:variable>
    				<xsl:choose>
    					<!-- si il est pere => recursivité -->
    					<xsl:when test="../../../event[father = $sonid]">
    						<xsl:apply-templates select="../../../event[father = $sonid]"/>
    					</xsl:when>
    					<!-- sinon l'afficher en item -->
    					<xsl:otherwise>
    						<item><xsl:attribute name="id"><xsl:value-of select="$sonid"/></xsl:attribute></item>
    					</xsl:otherwise>
    				</xsl:choose>
    			</xsl:for-each>	
    		</container>
    	</xsl:template>
     
    </xsl:stylesheet>
    Je ne suis pas un pro du XSL, et j'ai un peu de mal a comprendre les différrence entre copy-of, apply-template, call-template etc.
    Je suis sur qu'avec ces fonctions, on peut faire mieux et plus rapide.

Discussions similaires

  1. Aide pour construire une requête SQL
    Par squalito dans le forum Oracle
    Réponses: 1
    Dernier message: 09/03/2007, 15h04
  2. Aide pour construire une requête SQL
    Par squalito dans le forum Langage SQL
    Réponses: 3
    Dernier message: 09/03/2007, 14h08
  3. [SQL] aide pour construire une requête
    Par mealtone dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 04/08/2006, 15h16
  4. Réponses: 3
    Dernier message: 13/04/2006, 16h57
  5. [MIB] Questions pour construire une mib
    Par fadoua dans le forum Développement
    Réponses: 4
    Dernier message: 11/03/2004, 10h47

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