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 :

[XSLT] regroupement et identifiant


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 225
    Points : 97
    Points
    97
    Par défaut [XSLT] regroupement et identifiant
    bonsoir

    je debute en xml et je voudrais convertir un document xml suivant le schema de sa nouvelle dtd, et evidement je n'ai pas tout compris....
    avant tout 2 questions:
    soit le document 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
     
    <FILMS>
    <film>
    ..
    <realisateur id="r1">
    <nom>nom1</nom>
    </prenom>prenom1</prenom>
    </realisateur>
    ..
    <acteurs>
    <acteur id="a1">
    <nom>nom1</nom>
    </prenom>prenom1</prenom>
    </acteur>
    ...
    </acteurs>
    </film>
     
    <film>
    </film>
    ...
    </FILMS>
    pour eviter les redondances, on a cree un nouvel element :personne avec un attr ID et on a rajouter des references IDREF vers cet ID aux elements realisateur et acteur

    pour l'ensemble des films on veut eviter les doublons, on devrait obtenir le fichier final suivant:

    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
     
    <FILMS>
    <film>
    ..
    <realisateur ref="r1"/>
    <personne id="r1">
    <nom>nom1</nom>
    </prenom>prenom1</prenom>
    </personne>
    ..
    <acteurs>
    <acteur ref="r1">
    ...
    </acteurs>
    </film>
     
    <film>
    </film>
    ...
    </FILMS>
    avec le code suivant j'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
    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
    50
    51
    52
    53
    54
     
    <xsl:template match="/FILMS">
    <xsl:element name="FILMS">
    	<xsl:apply-templates select="Film" />
    </xsl:element>
     
    </xsl:template>
     
    <xsl:template match="Film">
    	<xsl:element name="Film">
    		<xsl:for-each select="Realisateur">
    			<xsl:element name="Realisateur">
    				<xsl:attribute name="ref"><xsl:value-of select="@ID" /></xsl:attribute>
    				<xsl:element name="Personne">
    					<xsl:attribute name="ID"><xsl:value-of select="@ID" /></xsl:attribute>
    						<xsl:element name="Nom">
    							<xsl:value-of select="Nom" />
    						</xsl:element>
    						<xsl:element name="Prenom">
    							<xsl:value-of select="Prenom" />
    						</xsl:element>
    				</xsl:element>
    			</xsl:element>
    		</xsl:for-each>
     
    		<xsl:element name="Acteurs">
    		<xsl:for-each select="./Acteurs/Acteur">
    			<xsl:choose> 
    				<xsl:when test=".[not (.= preceding::Realisateur)]">
    					<xsl:element name="Acteur">
    						<xsl:attribute name="ref"><xsl:value-of select="@ID" /></xsl:attribute>
    						<xsl:element name="Personne">
    							<xsl:attribute name="ID"><xsl:value-of select="@ID" /></xsl:attribute>
    								<xsl:element name="Nom">
    									<xsl:value-of select="Nom" />
    								</xsl:element>
    								<xsl:element name="Prenom">
    									<xsl:value-of select="Prenom" />
    								</xsl:element>
    						</xsl:element>
    					</xsl:element>
    				</xsl:when>
    				<xsl:otherwise>
    					<xsl:element name="Acteur">
    						<xsl:attribute name="ref"><xsl:value-of select="./preceding::Realisateur/@ID" /></xsl:attribute>
    					</xsl:element>
    				</xsl:otherwise>
    			</xsl:choose>
    		</xsl:for-each>
    		</xsl:element>
     
    	</xsl:element>
     
    </xsl:template>
    pour un seul realisateur qui est aussi acteur ca marche j'obtiens bien

    <realisateur ref="r1"/>
    et
    <acteur ref="r1">
    qui pointe vers la bonne personne créée une seule fois
    <personne id="r1">
    <nom>nom1</nom>
    </prenom>prenom1</prenom>
    </personne>

    mais lorsque j'ai 2 realisateurs qui jouent egalement j'obtiens
    <realisateur ref="r1"/>
    et
    <personne id="r1">
    <nom>nom1</nom>
    </prenom>prenom1</prenom>
    </personne>
    jusque la ok
    mais la...
    <acteur ref="r1 r2">
    ca ne va pas...les attributs d'origine ID se cumulent dans ref...

    qqu'un a une idee ?
    merci d'avance
    n

  2. #2
    Rédacteur

    Avatar de Erwy
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2003
    Messages
    4 967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 967
    Points : 10 927
    Points
    10 927
    Par défaut
    1) d'un point de vue donnée, laissé la balise personne dans film est pour moi une erreur
    2) en sortant personne de film tu gagne encore plus de place
    3) pour ce qui est des regroupement tu peux déjà jeter un oeil ici

    Comment regrouper les noeuds en fonction de leurs éléments qui se ressemblent ?

    Je n'ai pas trop le temps de développer ce soir, mais c'est assez simple de résoudre le problème si tu change la structure comme dans 1 et que tu utilise le 3 + une petite astuce

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 225
    Points : 97
    Points
    97
    Par défaut
    merci je vais regarder!
    je peux effectivement les sortir de film
    j'essaye tout ca demain
    je te tiens au cournat
    bonne soiree!
    n

Discussions similaires

  1. [XSLT]Regroupement par attribut.
    Par zserdtfg dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 08/12/2006, 11h35
  2. [XSLT] regrouper des noeuds identiques
    Par DelphLaga dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 14/11/2006, 17h07
  3. [XSLT] Regrouper les noeuds qui se ressemblent
    Par yos dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 19/10/2006, 16h51
  4. [XSLT] Regroupement ds XML
    Par Virginie dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 19/10/2006, 12h35
  5. [XSLT] Regroupement en utilsant xsl:key
    Par AVRAVR dans le forum XSL/XSLT/XPATH
    Réponses: 5
    Dernier message: 28/07/2006, 10h02

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