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 :

extraire un noeud d'un fichier XML avec XSL


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 7
    Points : 3
    Points
    3
    Par défaut extraire un noeud d'un fichier XML avec XSL
    Bonjour,

    Je dispose d'un fichier XML contenant beaucoup de balises, et je veux appliquer un fichier xsl pour en extraire une dizaines de balises.

    J'ai trouvé pas mal de choses sur Internet, mais toutes nécessitent de citer les balises dont je ne veux pas.

    Est-ce qu'il est possible de dire: je veux garder ces balises (que je cite dans le XSL) et éliminez toutes les autres (sans les citer) ?

    la seule façons que j'aie trouvée est celle-ci (mais elle nécessite de citer toutes les balises à éliminer ce qui n'est pas pratique ni évolutif !)

    Exemple réduite de fichier xml:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <toto>
    	<titi>
    		<a>aaa</a>
    		<b>bbb</b>
    		<c>ccc</c>
    	</titi>
    	<f>
    		<d>ddd</d>
    	</f>
    	<e>eee</e>
    </toto>
    Fichier xsl:
    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
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    	<xsl:output 
      		encoding="ISO-8859-15"
      		method="xml"
      		indent="yes" />
     
    	<xsl:template match="node() | @*">
    		<xsl:copy>
    			<xsl:apply-templates select="@* | node()"/>
    		</xsl:copy>
    	</xsl:template>
     
    	<xsl:template match="a">
    		<a>
    			<xsl:apply-templates select="@* | node()"/>
    		</a>
    	</xsl:template>
    	<xsl:template match="b"/>
    	<xsl:template match="c"/>
    	<xsl:template match="d"/>
    	<xsl:template match="e"/>
    	<xsl:template match="f"/>
    </xsl:stylesheet>
    résultat:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <toto>
    <titi>
    <a>aaa</a>
    </titi>
    </toto>
    merci de votre aide.

  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,

    pas la peine de citer toutes les balises, le template ci-dessous va matcher tout ce que tu ne demanderas pas explicitement. Et comme il ne fait rien...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    	<xsl:template match="child::node() | attribute::*" priority="-10">
    	</xsl:template>

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    merci de votre aide

    J'ai essayé d'insérer votre code dans mon xsl:

    j'ai supprimé toutes les lignes qui permettaient de supprimer les balises

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    	<xsl:template match="b"/>
    	<xsl:template match="c"/>
    	<xsl:template match="d"/>
    	<xsl:template match="e"/>
    	<xsl:template match="f"/>
    et je les ai remplacées par votre code.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <xsl:template match="child::node() | attribute::*" priority="-10">
    	</xsl:template>
    et j'ai laissé les lignes sélectionnant les balises désirées:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <xsl:template match="a">
    		<a>
    			<xsl:apply-templates select="@* | node()"/>
    		</a>
    	</xsl:template>
    J'obtiens ainsi le code 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
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    	<xsl:output 
      		encoding="ISO-8859-15"
      		method="xml"
      		indent="yes" />
     
     
    	<xsl:template match="a">
    		<a>
    			<xsl:apply-templates select="@* | node()"/>
    		</a>
    	</xsl:template>
     
    	<xsl:template match="child::node() | attribute::*" priority="-10">
    	</xsl:template>
     
    </xsl:stylesheet>
    Mais le résultat donne un fichier xml vide.

    Il y a un truc qui a dû m'échapper...

    Merci de m'éclairer.

  4. #4
    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,

    Désolé, ce sera mieux ainsi :
    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
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
     
    	<xsl:output 
    			encoding="ISO-8859-15"
    			method="xml"
    			indent="yes" />
     
     
    		<xsl:template match="a">
    			<a>
    				<xsl:copy-of select="text()"/>
    			</a>
    		</xsl:template>
     
    	<xsl:template match="child::node() | attribute::*" priority="-10">
    			<xsl:apply-templates/>
    	</xsl:template>
     
    	</xsl:stylesheet>
    ou même simplement

    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
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
     
    	<xsl:output 
    			encoding="ISO-8859-15"
    			method="xml"
    			indent="yes" />
     
     
    		<xsl:template match="a">
    				<xsl:copy-of select="."/>
    		</xsl:template>
     
    	<xsl:template match="text()"/>
     
    	</xsl:stylesheet>

  5. #5
    Membre émérite
    Avatar de polymorphisme
    Homme Profil pro
    Publishing
    Inscrit en
    Octobre 2009
    Messages
    1 460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Publishing
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2009
    Messages : 1 460
    Points : 2 371
    Points
    2 371
    Par défaut
    Bonjour,

    les noeuds non sélectionnés dans un xpath ne sont tout simplement pas traités par une feuille de style xsl.

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    Merci de m'aider sur ce sujet. J'y suis presque grace à la dernière solution de Krantz, mais elle ne me garde que la balise <a>.

    Or il faut quand même que je garde la balise <toto> car c'est la racine de mon xml et je peux avoir plusieurs balises <a>.

    Si je cite la balise toto (avec la même syntaxe que la balise <a> c'est à dire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    		<xsl:template match="toto">
    				<xsl:copy-of select="."/>
    		</xsl:template>
    toutes les balises filles réapparaissent...

    Que puis-je faire ?

    merci encore infiniment

  7. #7
    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
    plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <xsl:template match="toto">
    		<toto>
    			<xsl:apply-templates/>
    		</toto>
    	</xsl:template>

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    Merci beaucoup, Krantz, ça marche.

    Je fais un résumé ci-dessous pour de futurs visiteurs.

    Il ne me reste plus qu'à résoudre le fait que mon xslt, appliqué via un script vbs, me créee systématiquement un encodage UTF-16 et pas ISO-8859-1

    Donc résumons:

    Soit un fichier xml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <toto>
    	<titi>
    		<a>aaa</a>
    		<b>bbb</b>
    		<c>ccc</c>
    	</titi>
    	<f>
    		<d>ddd</d>
    	</f>
    	<e>eee</e>
    </toto>
    dont je ne voudrais garder que la balise <a> et ses balises mères <titi> et <toto>.
    Je lui applique le xsl 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
    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 
    			encoding="ISO-8859-15"
    			method="xml"
    			indent="yes" />
     
     
     
    	<xsl:template match="toto">
    		<toto>
    			<xsl:apply-templates/>
    		</toto>
    	</xsl:template>
    	<xsl:template match="titi">
    		<titi>
    			<xsl:apply-templates/>
    		</titi>
    	</xsl:template>
    		<xsl:template match="a">
    				<xsl:copy-of select="."/>
    		</xsl:template>
     
    	<xsl:template match="text()"/>
     
    	</xsl:stylesheet>
    et j'obtiens
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <?xml version="1.0" encoding="UTF-16"?>
    <toto>
    <titi>
    <a>aaa</a>
    </titi>
    </toto>

  9. #9
    Membre émérite
    Avatar de polymorphisme
    Homme Profil pro
    Publishing
    Inscrit en
    Octobre 2009
    Messages
    1 460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Publishing
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2009
    Messages : 1 460
    Points : 2 371
    Points
    2 371
    Par défaut
    Bonjour,

    tu as essayé ce petit code :

    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
    <?xml version="1.0" encoding="UTF-8"?>
     
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
     
    <xsl:output encoding="UTF-8" method="xml" indent="yes" />
     
     <xsl:template match="/">
    	<xsl:apply-templates/>
      </xsl:template>	
     
      <xsl:template match="a">
    	<toto><titi><a><xsl:value-of select="."/></a></titi></toto>
      </xsl:template>	
     
    </xsl:stylesheet>

Discussions similaires

  1. [XL-2007] Extraire des données d'un fichier Xml avec des balises identiques
    Par Danieldu54 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 08/03/2011, 20h45
  2. extraire les données d'un fichier xml avec xmlspy
    Par mouna1 dans le forum XML/XSL et SOAP
    Réponses: 1
    Dernier message: 05/06/2009, 13h50
  3. Réponses: 4
    Dernier message: 22/11/2008, 08h28
  4. Recuperation des noeuds d'un fichier xml avec xalan
    Par bellemlih dans le forum XML
    Réponses: 1
    Dernier message: 02/07/2008, 18h58
  5. extraire un fichier d'un fichier XML avec XSL ?
    Par pirbd dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 14/09/2005, 10h31

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