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 :

[Débutant][XSLT]Eviter les doublons


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre éprouvé Avatar de leminipouce
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2004
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2004
    Messages : 754
    Points : 1 253
    Points
    1 253
    Par défaut [Débutant][XSLT]Eviter les doublons
    Salut tout le monde.

    J'ai un fichier XML que je voudrais transformer. Pour ce faire, je tente de créer un XSLT.

    Mon fichier XMLen entrée ressemble à ça :
    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
    <Racine name="Racine">
    	<LEVEL name="Entity">
    		<VALUE>Un nom</VALUE>
    		<LEVEL name="Division">
    			<VALUE>Un autre nom</VALUE>
    			<SIZE name="Nom de taille 1">
    				<VALUE>120.0</VALUE>
    				<COLOR>
    					<NAME value="Nom de couleur 1.1">
    						<VALUE>-18.65</VALUE>
    					</NAME>
    					<NAME value="Nom de couleur 1.2">
    						<VALUE>-8.65</VALUE>
    					</NAME>
    					<NAME value="Nom de couleur 1.3">
    						<VALUE>14.7</VALUE>
    					</NAME>
    					<NAME value="Nom de couleur 1.4">
    						<VALUE>-9.1</VALUE>
    					</NAME>
    				</COLOR>
    			</SIZE>
    			<SIZE name="Nom de taille 2">
    				<VALUE>120.0</VALUE>
    				<COLOR>
    					<NAME value="Nom de couleur 2.1">
    						<VALUE>-18.65</VALUE>
    					</NAME>
    					<NAME value="Nom de couleur 2.2">
    						<VALUE>-8.65</VALUE>
    					</NAME>
    					<NAME value="Nom de couleur 2.3">
    						<VALUE>14.7</VALUE>
    					</NAME>
    				</COLOR>
    			</SIZE>
    		</LEVEL>
    	</LEVEL>
    </Racine>
    et je voudrais récupérer ceci :
    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
    <Racine>
    	<declarations>
    		<attributeDecl name="Name" type="String"/>
    		<attributeDecl name="Nom de taille 1" type="Float"/>
    		<attributeDecl name="Nom de couleur 1.1" type="Float"/>
    		<attributeDecl name="Nom de couleur 1.2" type="String"/>
    		<attributeDecl name="Nom de couleur 1.3" type="Float"/>
    		<attributeDecl name="Nom de couleur 1.4" type="Float"/>
    		<attributeDecl name="Nom de taille 2" type="Float"/>
    		<attributeDecl name="Nom de couleur 2.1" type="Float"/>
    		<attributeDecl name="Nom de couleur 2.2" type="String"/>
    		<attributeDecl name="Nom de couleur 2.3" type="Float"/>
    	</declarations>
    	<branch>
    		<attribute name="Name" value="Un nom"/>
    		<leaf>
    			<attribute name="Name" value="Un autre nom"/>
    			<attribute name="Nom de taille 1" value="1.0"/>
    			<attribute name="Nom de couleur 1.1" value="1.0"/>
    			<attribute name="Nom de couleur 1.2" value="Bonjour"/>
    			<attribute name="Nom de couleur 1.3" value="2.0"/>
    			<attribute name="Nom de couleur 1.4" value="0.16666666666666666"/>
    			<attribute name="Nom de taille 2" value="3.0"/>
    			<attribute name="Nom de couleur 2.1" value="1.0"/>
    			<attribute name="Nom de couleur 2.2" value="Coucou"/>
    			<attribute name="Nom de couleur 2.3" value="2.0"/>
    		</leaf>
    	</branch>
    </Racine>
    Je n'ai aucun problème pour créer toute le contenu des balises branches (une pour chaque Level, sauf le dernier level qui créer une balise Leaf).
    Mon problème c'est de créer la balise <Declaration>, car cette dernière doit contenir de manière unique toutes les balise <SIZE> et leurs sous-balises <COLORS>. Mais ces balises sont répétées à l'identique (ormis les valeurs...) pour chaque balise <LEVEL> de dernier niveau (donc transformée en balise <LEAF>)
    Pourriez-vous, s'il vous plaît, m'aider à trouver le code correspondant. Moi je tombe toujours sur une répétition de toute les balises, correspondant au nombre de level, ou alors uniquement les dernières balises colors (celles juste avant une nouvelle balise size).

    J'espère avoir été clair, et par avance, merci pour votre aide.

    PS: Question subsidiaire. Est-il possible avec XSLT de définir le type d'un attribut ==> ça m'aiderai à remplir les champs value="String" et value=Floata". Merci
    Si , et la ont échoué mais pas nous, pensez à dire et cliquez sur . Merci !

    Ici, c'est un forum, pas une foire. Il y a de respectables règles... à respecter !

  2. #2
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Bonjour,

    comme ton exemple de sortie ne correspond pas exactement à ton exemple d'entrée, il est difficile de savoir quelles sont les règles de transformation... Peux-tu être plus précis ?

    Sinon XSLT ne peux pas "deviner" le type de données contenues dans des attributs ; par contre, tu peux écrire une fonction qui utilise la fonction XPath number(x), qui renvoie la chaîne 'NaN' si x n'est pas un nombre :

    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
    <xsl:attribute name="type">
      <xsl:call-template name="renvoie-type">
        <xsl:with-param name="valeur" select="."/>
      </xsl:call-template>
    </xsl:attribute> 
    ...
    <xsl:template name="renvoie-type">
      <xsl:param name="valeur"/>
      <xsl:choose>
        <xsl:when test="number($valeur) = 'NaN'">
          <xsl:text>String</xsl:text>
        </xsl:when>
        <xsl:otherwise>
          <xsl:text>Float</xsl:text>
        </xsl:otherwise>
      </xsl:choose>
    </xsl:template>
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  3. #3
    Membre éprouvé Avatar de leminipouce
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2004
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2004
    Messages : 754
    Points : 1 253
    Points
    1 253
    Par défaut
    En effet, je n'ai pas fait attention (milles excuses ), je voulais faire apparaitre la possibilité d'avoir différents types d'attributs sans faire attention à la concordance des valeurs
    En entrée :
    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
    <Racine name="Racine"> 
       <LEVEL name="Entity"> 
          <VALUE>Un nom</VALUE> 
          <LEVEL name="Division"> 
             <VALUE>Un autre nom</VALUE> 
             <SIZE name="Nom de taille 1"> 
                <VALUE>-18.65</VALUE> 
                <COLOR> 
                   <NAME value="Nom de couleur 1.1"> 
                      <VALUE>-8.65</VALUE> 
                   </NAME> 
                   <NAME value="Nom de couleur 1.2"> 
                      <VALUE>14.7</VALUE> 
                   </NAME> 
                   <NAME value="Nom de couleur 1.3"> 
                      <VALUE>0.1666</VALUE> 
                   </NAME> 
                   <NAME value="Nom de couleur 1.4"> 
                      <VALUE>Bonjour</VALUE> 
                   </NAME> 
                </COLOR> 
             </SIZE> 
             <SIZE name="Nom de taille 2"> 
                <VALUE>3.0</VALUE> 
                <COLOR> 
                   <NAME value="Nom de couleur 2.1"> 
                      <VALUE>Comment ça va</VALUE> 
                   </NAME> 
                   <NAME value="Nom de couleur 2.2"> 
                      <VALUE>Coucou</VALUE> 
                   </NAME> 
                   <NAME value="Nom de couleur 2.3"> 
                      <VALUE>2.0</VALUE> 
                   </NAME> 
                </COLOR> 
             </SIZE> 
          </LEVEL> 
       </LEVEL> 
    </Racine>
    En sortie :
    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
    Code: 
    <Racine> 
       <declarations> 
          <attributeDecl name="Name" type="String"/> 
          <attributeDecl name="Nom de taille 1" type="Float"/> 
          <attributeDecl name="Nom de couleur 1.1" type="Float"/> 
          <attributeDecl name="Nom de couleur 1.2" type="Float"/> 
          <attributeDecl name="Nom de couleur 1.3" type="Float"/> 
          <attributeDecl name="Nom de couleur 1.4" type="String"/> 
          <attributeDecl name="Nom de taille 2" type="Float"/> 
          <attributeDecl name="Nom de couleur 2.1" type="String"/> 
          <attributeDecl name="Nom de couleur 2.2" type="String"/> 
          <attributeDecl name="Nom de couleur 2.3" type="Float"/> 
       </declarations> 
       <branch> 
          <attribute name="Name" value="Un nom"/> 
          <leaf> 
             <attribute name="Name" value="Un autre nom"/> 
             <attribute name="Nom de taille 1" value="-18.65"/> 
             <attribute name="Nom de couleur 1.1" value="-8.65"/> 
             <attribute name="Nom de couleur 1.2" value="14.7"/> 
             <attribute name="Nom de couleur 1.3" value="0.1666"/> 
             <attribute name="Nom de couleur 1.4" value="Bonjour"/> 
             <attribute name="Nom de taille 2" value="3.0"/> 
             <attribute name="Nom de couleur 2.1" value="Comment ça va"/> 
             <attribute name="Nom de couleur 2.2" value="Coucou"/> 
             <attribute name="Nom de couleur 2.3" value="2.0"/> 
          </leaf> 
       </branch> 
    </Racine>
    Donc en français ça donne quelque chose comme ça :
    • Récupérer dans la partie déclaration :
      • Un attributeDecl d'intitulé "Name" et dont le type est String
      • Un attributeDecl pour chacune des Size et des colors, dont on récupère le nom et dont le type correspond à celui qu'on va trouver pour la valeur de cet attribut. La liste des Size/Color est unique et est reproduite à l'identique pour chacune des Leaf. Bref, il y a un attributeDecl pour chacun des attribute se trouvant sous une (la première paar exemple) leaf

    • Récupérer dans chaque branch :
      • Un attribute d'intitulé "Name" et dont la valeur est celle du dernier level rencontré en entrée. Il y aura donc une Branch pour chacun des level excepté ceux de dernier niveau.
      • Une série de leaf, correspondant à chacun des levels de dernier niveau.

    • Récupérer dans chaque leaf:
      • Un attribute d'intitulé "Name" et dont la valeur est celle du dernier level rencontré en entrée. Il y aura donc une leaf pour chacun des levels de dernier niveau.
      • Un attribut dont le nom est celui de la dernière Size rencontrée, et dont on récupère également la valeur. Il y a plusieurs Size pour chacun des levels de dernier niveau
      • Un attribut dont le nom est celui de la dernière Color rencontrée, et dont on récupère également la valeur. Il y a plusieurs Color pour chacune des Sizes


    Voilà, j'espère avoir un peu explicité mon problème.
    Si , et la ont échoué mais pas nous, pensez à dire et cliquez sur . Merci !

    Ici, c'est un forum, pas une foire. Il y a de respectables règles... à respecter !

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 34
    Points : 39
    Points
    39
    Par défaut
    Pour obtenir ce que tu souhaites en sortie je te propose ceci.
    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
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
     
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions" xmlns:xdt="http://www.w3.org/2005/xpath-datatypes">
    <xsl:output indent="yes"/>
    <xsl:template match="/Racine">
    <xsl:element name="Racine">
    	<xsl:element name="declarations">
    		<xsl:element name="attributeDecl">
    			<xsl:attribute name="name">Name</xsl:attribute>
    			<xsl:attribute name="type">String</xsl:attribute>
    		</xsl:element>
    		<xsl:for-each select="LEVEL/LEVEL/SIZE">
    			<xsl:element name="attributeDecl">
    				<xsl:attribute name="Name">
    					<xsl:value-of select="@name">
    					</xsl:value-of>
    				</xsl:attribute>
    				<xsl:attribute name="Type">Float</xsl:attribute>
    			</xsl:element>
    			<xsl:for-each select="COLOR/NAME">
    				<xsl:element name="attributeDecl">
    				<xsl:attribute name="Name">
    					<xsl:value-of select="@value">
    					</xsl:value-of>
    				</xsl:attribute>
    				<xsl:attribute name="Type">Float</xsl:attribute>
    				</xsl:element>
    			</xsl:for-each>
    		</xsl:for-each>
    	</xsl:element>
    	<xsl:element name="branch">
    		<xsl:element name="attribute">
    			<xsl:attribute name="name">Name</xsl:attribute>
    			<xsl:attribute name="value">
    				<xsl:value-of select="/Racine/LEVEL/VALUE"></xsl:value-of>
    			</xsl:attribute>
    			<xsl:element name="leaf">
    				<xsl:for-each select="/Racine/LEVEL/LEVEL">
    					<xsl:element name="attribute">
    						<xsl:attribute name="name">Name</xsl:attribute>
    						<xsl:attribute name="value">
    							<xsl:value-of select="VALUE"/>
    						</xsl:attribute>
    					</xsl:element>
    					<xsl:for-each select="SIZE">
    						<xsl:element name="attribute">
    							<xsl:attribute name="name">
    								<xsl:value-of select="@name"/>
    							</xsl:attribute>
    							<xsl:attribute name="value">
    								<xsl:value-of select="VALUE"/>
    						    </xsl:attribute>
    						</xsl:element>
    						<xsl:for-each select="COLOR/NAME">
    							<xsl:element name="attribute">
    							<xsl:attribute name="name">
    								<xsl:value-of select="@value"/>
    							</xsl:attribute>
    							<xsl:attribute name="value">
    								<xsl:value-of select="VALUE"/>
    						    </xsl:attribute>
    						</xsl:element>
    						</xsl:for-each>
    					</xsl:for-each>
    				</xsl:for-each>
    			</xsl:element>
    		</xsl:element>
    	</xsl:element>
    </xsl:element>
    </xsl:template>
    </xsl:stylesheet>
    c'est super bourrin, mais ça fait, si j'ai bien compris, ce que tu souhaites. Concernant la récupération du type (string ou float), je ne sais pas comment faire ça (j'ai mis ça en dur dans le code XSL)

Discussions similaires

  1. [XSLT] eviter les doublons
    Par dadyFady dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 15/04/2010, 08h40
  2. [XSLT] eviter les doublons
    Par dadyFady dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 07/04/2010, 18h08
  3. [XSLT] Eviter les Doublons
    Par TheSquad dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 02/05/2008, 17h49
  4. [XSLT]Eviter les doublons
    Par yos dans le forum XSL/XSLT/XPATH
    Réponses: 5
    Dernier message: 12/07/2006, 15h52
  5. [langage] 2 fichier dans 1 en evitant les doublons
    Par remixxl dans le forum Langage
    Réponses: 6
    Dernier message: 26/07/2004, 17h05

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