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] remplacement de noeuds de manière récursive [FAQ]


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2
    Points : 2
    Points
    2
    Par défaut [XSLT] remplacement de noeuds de manière récursive
    Est-il possible de faire des remplacement de manière récursive comme suit ?

    Par exemple, à partir du 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
     
    <?xml version="1.0"?>
    <test>
    	<modele>
    		<p><!--date--></p>
    		<p>Bonjour, cher monsieur <!--nom-->.</p>
    		<!--footer-->
    	</modele>
    	<proprietes>
    	        <date>20/10/2005</date>
    	        <nom>Dupont</nom>
    	        <footer>
    	              <p><!--page--></p>
    	        </footer>
    	        <page>1/5</page>
    	</proprietes>
    </test>
    Je souhaiterais obtenir:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <p>20/10/2005</p>
    <p>Bonjour, cher monsieur Dupont.</p>
    <p>1/5</p>
    A première vue, ce n'est pas très compliqué, il suffit de substituer la valeur de noeuds (ici, j'utilise des commentaires) par une copie du contenu du noeud dont le nom correspond.

    Le problème, c'est que je souhaiterais gérer les imbrications, comme on peut le voir avec le footer par exemple.

    C'est là que je bloque, quelqu'un pourrait-il me dire si c'est possible, et si oui me donner des pistes ? (peu importe que ce soit en XSLT 1 ou XSLT 2).

    Merci

  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,

    il y a plusieurs façons, en utilisant des templates "simples" ou des templates nommés (fonctions). Voici une solution avec des templates "simples", je te laisse le soin de chercher une solution avec des fonctions :
    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
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    	<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
     
    	<xsl:template match="/">
    		<page>
    			<xsl:apply-templates select="test/modele/*|test/modele/comment()"/>
    		</page>
    	</xsl:template>
     
    	<xsl:template match="modele/*|proprietes/*/*">
    		<xsl:copy>
    			<xsl:apply-templates/>
    		</xsl:copy>
    	</xsl:template>
     
    	<xsl:template match="proprietes/*[*]">
    		<xsl:apply-templates select="*|comment()"/>
    	</xsl:template> 	
     
    	<xsl:template match="proprietes/*[not(*)]">
    		<xsl:apply-templates/>
    	</xsl:template>
     
    	<xsl:template match="comment()">
    		<xsl:apply-templates select="/test/proprietes/*[name() = current()]"/>
    	</xsl:template>
    </xsl:stylesheet>
    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
    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 : 47
    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
    tu m'as battu au poteau
    Par contre grand mechant, c'est pas beau de jouer sur les templates par defaut, ca ne facilite pas la comprehension (meme si c'est plus court flemmard )

    pour ceux qui auraient du mal avec ce code, il faut savoir qu'il existe des templates par defaut dans les processeur xslt.Si l'element n'est pas redefinie mais parsé elle s'applique ici
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
       <xsl:template match="text()">
    	   <xsl:value-of select="."></xsl:value-of>
       </xsl:template>
    a rajouter a son code

    cette template etant appellé par les
    d'ici
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <xsl:template match="modele/*|proprietes/*/*"> 
          <xsl:copy> 
             <xsl:apply-templates/> 
          </xsl:copy> 
       </xsl:template> 
     
       <xsl:template match="proprietes/*[not(*)]"> 
          <xsl:apply-templates/> 
       </xsl:template>

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    un grand merci pour vos réponses.
    Et dire que c'était si simple.

    ... J'étais parti dans un délire sur base de node-set() utilisé par un template qui s'appelle lui même de manière récursive.

    Su base de la réponse de GrandFather, j'ai modifié quelque peu le code pour lui donner un aspect plus général, et pour qu'il fonctionne avec les contenus contenant des balises.

    Pour ceux que ça intéresse, voilà ce que ça donne:
    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
     
    <?xml version="1.0"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     
    	<xsl:template match="node() | @*"> 
    		<xsl:copy> 
    			<xsl:apply-templates select="node() | @*"/> 
    		</xsl:copy> 
    	</xsl:template>   
     
    	<xsl:template match="/">	
    		<xsl:apply-templates select = "//modele" />
    	</xsl:template>
     
    	<xsl:template match="comment()">
    		<xsl:apply-templates select="/test/proprietes/param[@name = current()]"/>
    	</xsl:template>
     
    	<xsl:template match="param">
    		<xsl:apply-templates  />
    	</xsl:template>
     
    </xsl:stylesheet>
    Ce code permet donc de préserver les balises, par exemple, la balise "b" du xml source suivant n'est pas perdue dans l'opération, qu'elle soit utilisée dans le modèle ou dans les paramètres:

    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
     
    <?xml version="1.0"?>
    <test>
       <modele>
          <p><!--date--></p>
          <p>Bonjour, <b>cher</b> monsieur <!--nom-->.</p>
          <!--footer-->
       </modele>
       <proprietes>
               <param name="date">20/10/2005</param>
               <param name="nom">Dupont</param>
               <param name="footer">
                     <p><!--page--></p>
               </param>
               <param name="page">1/<b>6</b></param>
       </proprietes>
    </test>
    code xml généré:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <?xml version="1.0" encoding="UTF-16"?>
    <modele>
          <p>20/10/2005</p>
          <p>Bonjour, <b>cher</b> monsieur Dupont.</p>
           <p>1/<b>6</b></p>           
    </modele>

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XSLT] remplacer le contenu d'un noeud
    Par casgr1 dans le forum XSL/XSLT/XPATH
    Réponses: 10
    Dernier message: 29/06/2006, 09h50
  2. [XSLT ]remplacement d un caractere par son code
    Par luta dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 02/09/2005, 16h26
  3. [XSLT] enfants du noeud racine
    Par CandS dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 24/08/2005, 09h45
  4. [XSLT] Remplacer par des caractères spéciaux
    Par OXyGN dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 29/07/2005, 17h30
  5. [Zip] Dézipper de manière récursive
    Par Sfeabg dans le forum Entrée/Sortie
    Réponses: 8
    Dernier message: 08/03/2005, 16h24

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