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 :

Supprimer des balises d'un fichier XML via XSLT


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 24
    Points : 13
    Points
    13
    Par défaut Supprimer des balises d'un fichier XML via XSLT
    Bonjour à tous,

    Je possède un fichier XML de la forme :

    <personne>
    <nom>toto</nom>
    <prenom>NA</prenom>
    <age>19</age>
    <taille>170</taille>
    <ville>NA</ville>
    </personne>

    et je voudrai faire un template qui me permette de supprimer les lignes où la valeur de la balise est "NA".
    Donc en gros en sortie je devrai avoir le fichier XML suivant :

    <personne>
    <nom>toto</nom>
    <age>19</age>
    <taille>170</taille>
    </personne>

    Si quelqu'un à une idée je suis preneur ^^

    D'avance merci pour vos réponses.

    Cordialement

    La Bastoss

  2. #2
    Membre actif Avatar de Mamypirate
    Homme Profil pro
    Samouraï
    Inscrit en
    Mai 2011
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Samouraï
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2011
    Messages : 108
    Points : 211
    Points
    211
    Par défaut
    Bonjour,

    Tu peux essayer comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <xsl:stylesheet>
     
    	<xsl:template match="*[text()!='NA']">
    		&lt;<xsl:value-of select="local-name(.)"/>&gt;
    		<xsl:apply-templates/>
    		&lt;/<xsl:value-of select="local-name(.)"/>&gt;
    	</xsl:template>
     
    	<xsl:template match="*"></xsl:template>
     
    </xsl:stylesheet>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    try {
    findSignature();
    } catch(InspirationNotFoundException e) {
    e.printStackTrace();
    }

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 24
    Points : 13
    Points
    13
    Par défaut
    Merci cela fonctionne. ^^

    Cordialement

    La Bastoss.

  4. #4
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Je conseille plutôt :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <xsl:stylesheet>
     
      <xsl:template match="*[string(.) != 'NA']">
        <xsl:copy>
          <xsl:copy-of select="@*"/>
          <xsl:apply-templates/>
        </xsl:copy>
      </xsl:template>
    
      <xsl:template match="*"></xsl:template>
    	
    </xsl:stylesheet>
    - &lt;<xsl:value-of select="local-name(.)"/>&gt; n'est pas censé fonctionner, non -_-°. Si ça fait vraiment ce qui était demandé, c'est un bug du moteur XSLT. Avec ceux que j'utilise et qui sont largement reconnus, ça ne fait pas ce qui était demandé.
    Pour copier un élément, mieux vaut utiliser xsl:copy.
    Ou au pire, xsl:element, si on comprend pas xsl:copy.

    - <xsl:copy-of select="@*"/> copiera les éventuels attributs de l'élément.

    - string(.) au lieu de text() permettra de convertir le contenu de l'élément en cours en une string, et après on vérifie si cette string est égale à 'NA' ou pas. text() sélectionne uniquement les nœuds textes enfants. S'il n'y en a pas, donc si l'élément est vide, text() renvoie l'ensemble vide et l'ensemble vide n'est différent de rien, donc pas de NA non plus. C'est peut-être acceptable, mais ce n'était pas dans le cahier des charges . Et de toute façon c'est pas prudent.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre actif Avatar de Mamypirate
    Homme Profil pro
    Samouraï
    Inscrit en
    Mai 2011
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Samouraï
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2011
    Messages : 108
    Points : 211
    Points
    211
    Par défaut
    Effectivement xsl:copy-of semble beaucoup plus "propre" ! Bon à savoir merci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    try {
    findSignature();
    } catch(InspirationNotFoundException e) {
    e.printStackTrace();
    }

  6. #6
    Membre actif
    Avatar de VforVincent
    Homme Profil pro
    Doctorant (EPUB 3.0)
    Inscrit en
    Avril 2011
    Messages
    115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Doctorant (EPUB 3.0)
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 115
    Points : 265
    Points
    265
    Par défaut
    Pourquoi chercher compliqué ? On veut supprimer l'élément qui contient NA c'est bien ça ?

    Alors tout simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:template match="*[string(.) != 'NA']"/>
    Il n'y a pas de sous-éléments, puisque apparemment il s'agit d'une structure plate. En proposant un template vide, j'efface complètement l'élément. J'obtiens ce que Mamypirate demande.

    Qu'est-ce que tu en penses thelvin ?

    "The power of the Web is in its universality.
    Access by everyone regardless of disability is an essential aspect."

    Tim Berners-Lee, W3C Director and inventor of the World Wide Web

  7. #7
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Ça se tient, mais il faudra quand même le template pour recopier tout le reste :

    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>
    Ça ne va pas se faire par défaut.
    De plus, un fichier XML n'est jamais complètement plat : il faut aussi gérer la racine. Mais ce n'est pas spécialement un problème pour ton approche : apply-templates va s'appliquer à tous les fils.

    Au fait, c'est LaBastoss qui a fait la demande.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  8. #8
    Membre actif
    Avatar de VforVincent
    Homme Profil pro
    Doctorant (EPUB 3.0)
    Inscrit en
    Avril 2011
    Messages
    115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Doctorant (EPUB 3.0)
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 115
    Points : 265
    Points
    265
    Par défaut
    Au fait, c'est LaBastoss qui a fait la demande.
    Oui je sais, mais je demandais ton aval

    Ça se tient, mais il faudra quand même le template pour recopier tout le reste :
    C'est sûr, mais la demande porte sur "un template qui supprime". Je ne donne donc pas le reste.

    De plus, un fichier XML n'est jamais complètement plat
    En effet ! Mais l'exemple de LaBastoss présente une structure plate. En combinant tes conseils et mon mini-template, on obtient :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    <xsl:template match="/">
        <xsl:apply-templates/>
    </xsl:template>
     
    <xsl:template match="*">
      <xsl:copy>
        <xsl:apply-templates/>
      </xsl:copy>
    </xsl:template>
     
    <xsl:template match="*[string(.) != 'NA']"/>
    Quelque chose comme ça, non ?

    "The power of the Web is in its universality.
    Access by everyone regardless of disability is an essential aspect."

    Tim Berners-Lee, W3C Director and inventor of the World Wide Web

  9. #9
    Nouveau membre du Club
    Inscrit en
    Mai 2012
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Mai 2012
    Messages : 51
    Points : 27
    Points
    27
    Par défaut
    Merci, ça m'a bien aidé, mais j'ai une autre question très liée :

    Si mon envie, c'est de supprimer toutes les balises <nom> (et ses fils), peut importe le contenu ?
    J'arrive pas à trouver en partant de votre solution... (je sais je suis mauvais :p )

    Et dans le cas ou les balises que je veux supprimer ont un attribut ayant une valeur particulière ?
    Genre les balises avec "france" pour name comme : <country name="france" />. Je sais (ou je pense) qu'il faut juste replace le "string(.)" par autre chose, mais bon...

Discussions similaires

  1. [WD18] Supprimer des lignes dans un fichier xml
    Par cid5420 dans le forum WinDev
    Réponses: 26
    Dernier message: 10/04/2014, 10h04
  2. Format des balise dans un fichier XML
    Par Caillou63 dans le forum C#
    Réponses: 2
    Dernier message: 03/05/2010, 11h10
  3. [PHP 4] Extraire des données d'un fichier xml via xsl et xpath
    Par fraisa1985 dans le forum Langage
    Réponses: 1
    Dernier message: 12/01/2010, 10h23
  4. Réponses: 9
    Dernier message: 18/05/2009, 08h25
  5. awk- supprimer des balises d'un fichier XML
    Par joeyd dans le forum Linux
    Réponses: 1
    Dernier message: 06/11/2007, 11h28

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