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

XML/XSL et SOAP Discussion :

Appliquer un filtre sur le nom d'éléments XML pour la création d'un nouveau XML


Sujet :

XML/XSL et SOAP

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2008
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Appliquer un filtre sur le nom d'éléments XML pour la création d'un nouveau XML
    Bonjour, je suis présentement un cours en XML/XSL et je n'arrive pas à régler un problème avec un de mes travaux. Je dois filtrer un document XML et vérifier si le nom d'un élément contient le caractère "a", si oui je dois le reproduire dans un nouveau XML (l'élément et ses attributs). Voici le XML et le résultat attendu.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <?xml version="1.0" ?>
    <?xml-stylesheet href="exemple.xsl" type="text/xsl" ?>
    <agenda>
    <ami ref="Joe"><tel>555-2121</tel><adr>12 avenue</adr></ami>
    <client no="123"><adr>456 Lafleur</adr></client>
    </agenda>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <agenda>
    <ami ref="Joe"><adr>12 avenue</adr></ami>
     
    </agenda>
    J'arrive à éliminer l'élément "client" mais l'élément "tel", je n'arrive pas à le filtrer. Voici le XSL que j'utilise :

    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="ISO-8859-1"?>
    <xsl:stylesheet version="1.0" xmlnssl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" version="1.0" encoding="ISO-8859-1" indent="yes"/>
    <xsl:template match="node()">
    <xsl:copy>
    <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
    </xsl:template>
    <xsl:template match="text()">
    <xsl:value-of select="."/>
    </xsl:template>
    <xsl:template match="@*">
    <xsl:attribute name="{name()}"><xsl:value-of select="."/></xsl:attribute>
    </xsl:template>
    <xsl:template match="client"></xsl:template>
    </xsl:stylesheet>
    -------------------------------------------

    Un coup de main serait bien apprécié.

    Merci

  2. #2
    Membre éprouvé
    Profil pro
    Responsable Dev
    Inscrit en
    Décembre 2003
    Messages
    788
    Détails du profil
    Informations personnelles :
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Responsable Dev

    Informations forums :
    Inscription : Décembre 2003
    Messages : 788
    Points : 1 063
    Points
    1 063
    Par défaut
    essaie cela
    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
     
    <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()[contains(.,'a')]">
    		<xsl:copy>
    			<xsl:apply-templates select="@* | node()"/>
    		</xsl:copy>
    	</xsl:template>
     
    	<xsl:template match="@*">
    		<xsl:copy>
    			<xsl:apply-templates select="@* | node()"/>
    		</xsl:copy>
    	</xsl:template>
     
    	<xsl:template match="text">
    		<xsl:copy>
    			<xsl:apply-templates select="@* | node()"/>
    		</xsl:copy>
    	</xsl:template>
    </xsl:stylesheet>

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2008
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Merci Fraoustin,

    Je vois que maintenant au moins un certain filtre commence à s'appliquer mais ce n'est pas tout à fait le résultat attendu par mon prof. J'ai exécuté ta proposition XSL et voici le résultat du nouveau XML :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <?xml version="1.0" encoding="ISO-8859-15"?>
    <agenda>
    <ami ref="Joe">555-2121<adr>12 avenue</adr>
    </ami>
    <client no="123">
    <adr>456 Lafleur</adr>
    </client>
    </agenda>
    Je pense qu'on ne ferait jamais ce type de transformation dans la vraie vie mais la requête tordue de mon prof veut que l'on élimine tout élément principal (noeud), ainsi que les sous-éléments (dans ce noeud) qui n'ont pas la lettre 'a' dans leur nom, si le noeud principal n'a pas de 'a' dans son nom, il doit être éliminé complètement. Donc la valeur du sous-élément <tel> ainsi que l'élément <client> au complet doivent être oubliés dans le nouveau XML. Je sais qu'il faut que je scrute tous les sous-éléments, une fois la première condition satisfaite bien sûr (il y a un 'a' dans son nom), pour déterminer s'il y a aussi un 'a' alors, ce sous-élément peut faire partie du nouveau XML. Cet exercice a pour but que l'on devienne très "fluide" selon l'expression du prof pour se déplacer dans l'arbre de noeuds et j'avoue que je suis pas encore là.

    Merci pour ton aide.

  4. #4
    Membre éprouvé
    Profil pro
    Responsable Dev
    Inscrit en
    Décembre 2003
    Messages
    788
    Détails du profil
    Informations personnelles :
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Responsable Dev

    Informations forums :
    Inscription : Décembre 2003
    Messages : 788
    Points : 1 063
    Points
    1 063
    Par défaut
    je pourrais te dire cherche, travail un peu, la demande n'est pas si absurde (j'ai déjà fait plus stupide pour des vrais entreprise)
    voila un bout de 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
    16
    17
    18
    19
     
    <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()[contains(name(),'a')]">
    		<xsl:copy>
    			<xsl:apply-templates select="*"/>
    		</xsl:copy>
    	</xsl:template>
     
    	<xsl:template match="@* | text">
    		<xsl:copy>
    			<xsl:apply-templates select="@* | node()"/>
    		</xsl:copy>
    	</xsl:template>
    </xsl:stylesheet>
    ps: je te donne la réponse car le jeu de chercher une solution est l'intéressant pour moi, mais cherche au moins à comprendre la solution

  5. #5
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2008
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Merci pour ton aide Fraoustin, tu m'as bien aiguillé.

    J'ai résolu le problème en utilisant "stars-with" de cette manière.
    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
    <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()[contains(name(),'a')]">
    		<xsl:copy>
    			<xsl:apply-templates select="@* | node()"/>
    		</xsl:copy>
    	</xsl:template>
     
    	<xsl:template match="@*">
    		<xsl:copy>
    			<xsl:apply-templates select="@*"/>
    		</xsl:copy>
    	</xsl:template>
     
    	<xsl:template match="*">
    	<xsl:if test="starts-with(text(),'a')">
                <xsl:value-of select="."/>
         </xsl:if>
         </xsl:template>
     
    </xsl:stylesheet>
    Je vais maintenant me consacrer à l'autre solution demandé par le prof qui exige que j'utilise xsl:element au lieu de xsl:copy pour obtenir le même résultat. Je sens qu'encore là je vais travailler fort ...

Discussions similaires

  1. [AC-2003] Appliquer un filtre sur un formulaire Login/mdp
    Par Chagui dans le forum VBA Access
    Réponses: 6
    Dernier message: 24/08/2010, 11h20
  2. Appliquer un style sur un tableau d'éléments
    Par Arnaud F. dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 16/07/2009, 10h29
  3. Réponses: 1
    Dernier message: 13/03/2009, 17h29
  4. Réponses: 4
    Dernier message: 04/02/2008, 18h09
  5. appliquer des filtres sur image
    Par MANU_2 dans le forum Débuter
    Réponses: 1
    Dernier message: 10/01/2008, 12h02

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