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] Restructuration + merge d'éléments


Sujet :

XSL/XSLT/XPATH XML

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 2
    Par défaut [XSLT] Restructuration + merge d'éléments
    Bonjour,

    J'aimerais restructurer le XML 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
    <Root>
    	<Key Country="FR" City="NCE" Type="S">
    		<Value>12.52</Value>
    		<Description>AAA</Description>
    	</Key>
    	<Key Country="FR" City="NCE" Type="B">
    		<Value>72</Value>
    		<Description>BBB</Description>
    	</Key>
    	<Key Country="FR" City="PAR" Type="B">
    		<Value>8</Value>
    		<Description>CCC</Description>
    	</Key>
    	<Key Country="US" City="NYK" Type="B">
    		<Value>72</Value>
    		<Description>DDD</Description>
    	</Key>
    </Root>
    afin d'obtenir 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
    <Root>
    	<Country Code="FR">
    		<City Code="NCE">
    			<Type Code="S">
    				<Value>12.52</Value>
    				<Description>AAA</Description>
    			</Type>
    			<Type Code="B">
    				<Value>72</Value>
    				<Description>BBB</Description>
    			</Type>
    		</City>
    		<City Code="PAR">
    			<Type Code="B">
    				<Value>8</Value>
    				<Description>CCC</Description>
    			</Type>
    		</City>
    	</Country>
    	<Country Code="US">
    		<City Code="NYK">
    			<Type Code="B">
    				<Value>72</Value>
    				<Description>DDD</Description>
    			</Type>
    		</City>
    	</Country>
    </Root>
    Donc, comme l'exemple le montre, le but est d'éclater le noeud Key en plusieurs noeuds, chacun avec un champ de la Key, et de factoriser les noeuds créés (même Country, puis même City). On part du principe qu'il n'y a pas de doublons (i.e. 2 Keys avec les mêmes Country, City, Type).

    J'ai essayé de m'inspirer des exemples sur le forum mais je ne vois pas comment les adapter à mon cas. Rien qu'en essayant de merger le Country, le code suivant n'est pas adapté (je ne garde que la première donnée pour FR).

    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
    <xsl:key name="countryKey" match="Key" use="@Country" />
     
    	<xsl:template match="/Root">
    		<Root>
    			<xsl:for-each select="//Key[generate-id(.)=generate-id(key('countryKey', @Country)[1])]">
    				<Country>
    					<xsl:attribute name="CountryCode"><xsl:value-of select="@Country" /></xsl:attribute>
    					<xsl:apply-templates select="node()" />
    				</Country>
    			</xsl:for-each>
    		</Root>
    	</xsl:template>
     
    	<xsl:template match="node() | @*">
    		<xsl:copy>
    			<xsl:apply-templates select="@* | node()" />
    		</xsl:copy>
    	</xsl:template>
    Je n'ai pas trouvé de problème semblable sur le forum.
    Avez-vous une piste à me donner? Merci!

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

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Par défaut
    Bonjour,
    Citation Envoyé par LxPanj Voir le message
    Je n'ai pas trouvé de problème semblable sur le forum.
    Le problème du regroupement est récurrent en XSLT, mais tous les problèmes ne sont pas totalement identiques, il faut donc en adapter le principe général (la méthode Muench) au cas par cas. Cela nécessite d'en avoir bien compris le mécanisme, et d'être assez à l'aise avec XPath.

    Dans ce cas précis, voici une des solutions possibles:
    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
     
    <xsl:key name="keys-by-country" match="Key" use="@Country"/>
    <xsl:key name="keys-by-city" match="Key" use="@City"/>
    <xsl:template match="Root">
      <xsl:copy>
        <xsl:for-each select="Key[generate-id() = generate-id(key('keys-by-country', @Country)[1])]">
          <xsl:variable name="current-country" select="@Country"/>
          <Country Code="{$current-country}">
            <xsl:for-each select="../Key[generate-id() = generate-id(key('keys-by-city', @City)[1]) and @Country = $current-country]">
              <xsl:variable name="current-city" select="@City"/>
              <City Code="{@City}">
                <xsl:for-each select="key('keys-by-country', $current-country)[@City = $current-city]">
                  <Type Code="{@Type}">
                    <xsl:copy-of select="Value|Description"/>
                  </Type>
                </xsl:for-each>
              </City>
            </xsl:for-each>
          </Country>
        </xsl:for-each>
      </xsl:copy>
    </xsl:template>
    [EDIT] J'avais oublié de mentionner dans le code les deux lignes de définition des index (keys-by-country et keys-by-city). C'est maintenant chose faite.
    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
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 2
    Par défaut
    J'ai des progres a faire pour comprendre cette maniere de penser assez particuliere en XSLT. En tout cas, je suis impressionne par la concision de cette solution, je m'attendais a quelque chose de plus lourd. Merci mille fois!

Discussions similaires

  1. [Débutant] [XSLT] URL à partir d'éléments récursifs
    Par SaturnFox dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 05/07/2007, 12h26
  2. [XSLT] Restructuration d'un fichier XML
    Par biggione dans le forum XSL/XSLT/XPATH
    Réponses: 7
    Dernier message: 13/06/2007, 10h21
  3. [XSLT][XPATH] Nombre d'élèment ayant pour nom..
    Par SONY30 dans le forum XSL/XSLT/XPATH
    Réponses: 9
    Dernier message: 26/04/2007, 13h49
  4. [XSLT] somme sur les éléments d'un sous arbre
    Par Raumfahrerralf dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 17/03/2007, 16h23
  5. [XSLT] Texte d'un élément, mais pas de ses enfants
    Par PierreY dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 28/02/2007, 10h22

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