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 :

Copier un document XML, sauf certaines balises


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 8
    Par défaut Copier un document XML, sauf certaines balises
    Bonjour,

    Je me retrouve face un à problème que je n'arrive pas à résoudre, le but étant de transformer un fichier XML vers un autre fichier XML en utilisant la transformation par XSLT.
    La transformation doit comprendre la suppression d'une balise et de ses filles en fonction de la valeur d'une autre balise.

    Concretement :
    Fichier XML 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
     
      <bal1>
    	<bal1_1>val1</bal1_1>
            <bal1_2>false</bal1_2>
    	<bal1_3>
    	  <bal1_3_1>
    		<bal1_3_1_1>Nom</bal1_3_1_1>
    	  </bal1_3_1>
    	</bal1_3>
    	<bal1_4>Val 3</bal1_4>
      </bal1>
      <bal1>
    	<bal1_1>val1</bal1_1>
    	<bal1_2>true</bal1_2>
    	<bal1_3>
    	  <bal1_3_1>
    		<bal1_3_1_1>Nom</bal1_3_1>
    	  </bal1_3_1>
    	</bal1_3>
    	<bal1_4>Val 3</bal1_4>
      </bal1>
    fichier XML voulu 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
     
      <bal1>
    	<bal1_1>val1</bal1_1>
    	<bal1_2>false</bal1_2>
    	<bal1_4>Val 3</bal1_4>
      </bal1>
      <bal1>
    	<bal1_1>val1</bal1_1>
    	<bal1_2>true</bal1_2>
    	<bal1_3>
    	  <bal1_3_1>
    		<bal1_3_1_1>Nom</bal1_3_1>
    	  </bal1_3_1>
    	</bal1_3>
    	<bal1_4>Val 3</bal1_4>
      </bal1>
    Condition : Si <bal1_2> contient "false" on fait disparaitre la balise <bal1_3> et ses filles.

    Merci d'avance pour votre aide.

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Le plus simple serait de faire un template qui copie tout tel que :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <xsl:template match="*">
      <xsl:copy>
        <xsl:apply-templates/>
      </xsl:copy>
    </xsl:template>
    Et d'ajouter un autre template dans le cas des balises qu'on ne veut pas garder :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <xsl:template match="bal1_3[ conditionPourNePasGarderLaBalise ]">
      <!--
        On ne met rien, rien du tout dans ce template.
        Donc la balise n'est pas copiée et ses filles non plus.
        Donc elles ne sont pas dans le document produit.
      -->
    </xsl:template>
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 8
    Par défaut
    Merci pour cette réponse rapide

    j'ai malgrés tout un soucis, je n'arrives pas à baser ma condition sur la balise précédente, en effet, il faudrait que le deuxieme template fasse ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <xsl:template match="bal1_3">
    		<xsl:if test="bal1_2 = 'true'">
    		  <xsl:copy>
    			<xsl:apply-templates/>
    		  </xsl:copy>
    		</xsl:if> 
    	</xsl:template>
    Le problème me semble-t-il est que je dois baser ma condition sur la balise précédente, et je ne sais pas comment faire ...

    Merci d'avance

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    precedent-sibling::

    edit: preceding-sibling::, stupide que je suis -_-°
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 8
    Par défaut
    Bonjour à tous,

    Je viens cloturer la discussion en donnant la solution complète, ça pourrait intéresser quelqu'un

    Merci Thelvin pour ton aide

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    	<!-- Recopie tout le document -->
    	<xsl:template match="*">
    	  <xsl:copy>
    		<xsl:apply-templates/>
    	  </xsl:copy>
    	</xsl:template>
     
    	<xsl:template match="titi/toto/tatat">
    			<xsl:if test="./preceding-sibling::fifi/text()='true'">
    				<xsl:copy-of select="." />
    			</xsl:if>
    	</xsl:template>

  6. #6
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Tu peux simplifier en :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:if test="preceding-sibling::fifi = 'true'">
    - Pas besoin du ./ il est implicite.

    - Pas besoin du /text(). Si tu compares un élément avec une string, c'est le contenu texte de cet élément qui sera comparé à la string. Ce n'est pas toujours équivalent à /text(), mais c'est plus simple et en général ce qu'on veut.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

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

Discussions similaires

  1. copier un document XML et déplacer un élément
    Par venus02 dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 09/02/2014, 00h21
  2. copier un document XML a partir de l'URL
    Par am@123 dans le forum XML/XSL et SOAP
    Réponses: 4
    Dernier message: 18/06/2009, 13h20
  3. [XSLT]Comment copier un document xml avec xslt.
    Par maa dans le forum XSL/XSLT/XPATH
    Réponses: 9
    Dernier message: 07/05/2009, 14h02
  4. [XSLT] Extraire certaines balises d'un document XML
    Par Wookai dans le forum XSL/XSLT/XPATH
    Réponses: 7
    Dernier message: 10/04/2007, 09h09

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