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] Regrouper des balises pour hiérarchiser


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2009
    Messages : 2
    Points : 1
    Points
    1
    Par défaut [XSLT] Regrouper des balises pour hiérarchiser
    Bonjour,

    J'ai deux problèmes avec un fichier xml :

    1. le xml original n'a aucune structure car toutes les balises (exception faite de l'élément racine) sont au même niveau. Mon but est d'insérer une balise <toto> qui aurait pour enfant un FM1Titre et toutes les balises qui le suivent jusqu'à la prochaine occurence FM1Titre.

    2. Je voudrais reporter le contenu de la balise FM1Titre comme nom de la balise mère que j'ai mentionné au dessus.

    Voici un bout de mon fichier .xml :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <XML> 
    <FM1Titre>Description </FM1Titre> 
    <Bloc-paragraphe>La table mère permet de paramétrer les tables. </Bloc-paragraphe> 
    <Bloc-paragraphe>Toute nouvelle table doit être créée en premier lieu dans la table mère.</Bloc-paragraphe> 
     
    <FM1Titre>Détails techniques </FM1Titre> 
    ...</XML>
    Ce qu'il faudrait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <XML> 
    <Description> 
    <FM1Titre>Description </FM1Titre> 
    <Bloc-paragraphe>La table mère permet de paramétrer les tables. </Bloc-paragraphe> 
    <Bloc-paragraphe>Toute nouvelle table doit être créée en premier lieu dans la table mère.</Bloc-paragraphe> 
    </Description> 
     
    <Détails techniques> 
    <FM1Titre>Détails techniques </FM1Titre> 
    </Détails techniques> 
     
    ...</XML>
    Mes recherches sont restées infructueuses (recherches sur internet, solutions proposées sur le forum) et je commence à croire que ça ne peut peut-être pas se faire avec xslt 1.0.

    D'habitude j'arrive à m'en sortir mais là je séche, alors si jamais quelqu'un à une solution ou une piste, aidez-moi...

    Merci d'avance.

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Février 2009
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Février 2009
    Messages : 155
    Points : 231
    Points
    231
    Par défaut
    Bonjour,

    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
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
     
    <xsl:output method="xml" version="1.0" encoding="ISO-8859-1" indent="yes"/>
    	<xsl:strip-space elements="*"/>
     
    	<xsl:key name="elemKey" match="FM1Titre" use="generate-id( parent::XML )" />
    	<xsl:key name="elemKey" match="*[name() != 'FM1Titre' and name() != 'XML']" use="generate-id( preceding-sibling::FM1Titre[1]  )" />
     
    	<xsl:template match="/">
    		<xsl:apply-templates />
    	</xsl:template>
     
    	<xsl:template match="XML" >
    		<XML>
    			<xsl:apply-templates  select="key('elemKey', generate-id(.))"/>
    		</XML>
    	</xsl:template>
     
    	<xsl:template match="FM1Titre" >
    		<xsl:element name="{normalize-space(.)}">
    			<xsl:apply-templates  select="key('elemKey', generate-id(.))"/>
    		</xsl:element>
    	</xsl:template>
     
    	<xsl:template match="*" >
    		<xsl:copy-of select="."/>
    	</xsl:template>
     
    </xsl:stylesheet>
    attention toutefois : un contenu contenant un espace, comme "Détails techniques", ne passera pas comme nom d'élément !

    Le code a été testé avec le XML suivant ("Détails techniques" est devenu ""Détails_techniques")

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    <?xml version="1.0" encoding="UTF-8"?>
    <XML>
    	<FM1Titre>Description </FM1Titre>
    	<Bloc-paragraphe>La table mère permet de paramétrer les tables. </Bloc-paragraphe>
    	<Bloc-paragraphe>Toute nouvelle table doit être créée en premier lieu dans la table mère.</Bloc-paragraphe>
    	<FM1Titre> Détails_techniques</FM1Titre>
    	<Bloc-paragraphe>2 La table mère permet de paramétrer les tables. </Bloc-paragraphe>
    	<Bloc-paragraphe>2 Toute nouvelle table doit être créée en premier lieu dans la table mère.</Bloc-paragraphe>
    </XML>

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Février 2009
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Février 2009
    Messages : 155
    Points : 231
    Points
    231
    Par défaut
    ... pour coller précisément à la structure attendue, le code est :
    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
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
     
    <xsl:output method="xml" version="1.0" encoding="ISO-8859-1" indent="yes"/>
    	<xsl:strip-space elements="*"/>
     
    	<xsl:key name="elemKey" match="FM1Titre" use="generate-id( parent::XML )" />
    	<xsl:key name="elemKey" match="*[name() != 'FM1Titre']" use="generate-id( preceding-sibling::FM1Titre[1]  )" />
     
    	<xsl:template match="XML" >
    		<XML>
    			<xsl:apply-templates  select="key('elemKey', generate-id(.))"/>
    		</XML>
    	</xsl:template>
     
    	<xsl:template match="FM1Titre" >
    		<xsl:element name="{normalize-space(.)}">
    			<xsl:copy-of select="."></xsl:copy-of>
    			<xsl:apply-templates  select="key('elemKey', generate-id(.))"/>
    		</xsl:element>
    	</xsl:template>
     
    	<xsl:template match="*" >
    		<xsl:copy-of select="."/>
    	</xsl:template>
     
    </xsl:stylesheet>

  4. #4
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2009
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Merci beaucoup pour la solution. J'avais finalement quelque chose d'à peu près similaire.

    Vraiment merci d'avoir répondu.

Discussions similaires

  1. [XSLT] Affichage des balises xml en html via une xslt
    Par Eileen dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 20/04/2007, 15h53
  2. [XSLT] Utiliser des balises XHTML dans un fichier XML
    Par zoubidaman dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 20/03/2007, 14h30
  3. Des balises pour limiter mon texte
    Par malhivertman1 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 04/01/2007, 12h13
  4. [XSLT] regrouper des noeuds identiques
    Par DelphLaga dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 14/11/2006, 17h07
  5. [XSLT] Normalisation des valeurs pour les URL
    Par camboui dans le forum XSL/XSLT/XPATH
    Réponses: 9
    Dernier message: 10/01/2006, 12h33

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