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 :

ajouter un préfixe à certains éléments


Sujet :

XML/XSL et SOAP

  1. #1
    Membre confirmé
    Inscrit en
    Février 2011
    Messages
    465
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 465
    Points : 549
    Points
    549
    Par défaut ajouter un préfixe à certains éléments
    Bonjour,

    Puis-je soumettre ce problème à votre sagacité ? Je ne parviens pas à comprendre mon erreur et vos explications seront les bienvenues.

    Au départ, j'ai le 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
    <?xml version="1.0" encoding="UTF-8"?>
    <IntraConsignment IntraListingsNbr="1" xmlns="http://www.xyz.com/IntraConsignment" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:common="http://www.xyz.com/InputCommon">
    	<IntraListing SequenceNumber="1" ClientsNbr="13" AmountSum="150.50">
    		<Declarant>
    			<Name>ABC</Name>
    			<Street>xxx</Street>
    			<City>Abc</City>
    		</Declarant>
    		<Period>
    			<Year>2019</Year>
    		</Period>
    	</IntraListing>
    </IntraConsignment>
    à l'arrivée, je désire avoir le 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
    <?xml version="1.0" encoding="UTF-8"?>
    <IntraConsignment IntraListingsNbr="1" xmlns="http://www.xyz.com/IntraConsignment" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:common="http://www.xyz.com/InputCommon">
    	<IntraListing SequenceNumber="1" ClientsNbr="13" AmountSum="150.50">
    		<Declarant>
    			<common:Name>ABC</common:Name>
    			<common:Street>xxx</common:Street>
    			<common:City>Abc</common:City>
    		</Declarant>
    		<Period>
    			<Year>2019</Year>
    		</Period>
    	</IntraListing>
    </IntraConsignment>
    Comme vous le voyez la différence se situe au niveau du préfixe "common:" ajouté à tous les éléments descendants de "Declarant".

    J'ai essayé avec cette transformation XSLT
    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" encoding="UTF-8"?>
    <!-- The main xsd schema calls another schema for common elements used in different files -->
    <!-- we will change from : -->
    <!--  ...
    		<name>ABC</name>
       ... -->
       <!-- To : 
    		<common:name>ABC</common:name>
        ...   -->
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:common="http://www.xyz.com/InputCommon">
    	<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    	<xsl:template match="@*|*">
    		<xsl:copy>
    			<xsl:apply-templates select="node()|@*"/>
    		</xsl:copy>
    	</xsl:template>
     
        <xsl:template match="//Declarant">
    		<xsl:element name="common:{local-name()}">
    			<xsl:apply-templates select="@*|node()"/>
    		</xsl:element>  
    	</xsl:template> 
    </xsl:stylesheet>
    Malheureusement, cela ne fonctionne pas.
    Je pense que le problème provient de mon expression xpath dans la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:template match="//Declarant">
    parce que si j'écris
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:template match="*">
    , alors il me met généreusement des "common:" à tous les éléments.
    Où est mon erreur ?
    Je désire comprendre, merci de m'expliquer comment corriger.

    Merci.

  2. #2
    Membre confirmé
    Inscrit en
    Février 2011
    Messages
    465
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 465
    Points : 549
    Points
    549
    Par défaut
    Bon, j'ai trouvé !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        <xsl:template match="common:Declarant">
    pour plus de clareté, voici le XSLT complet :
    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
    <?xml version="1.0" encoding="UTF-8"?>
    <!-- we will change from : -->
    <!--  ...
    		<name>ABC</name>
       ... -->
       <!-- To : 
    		<common:name>ABC</common:name>
        ...   -->
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:common="http://www.xyz.com/InputCommon">
    	<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    	<xsl:template match="@*|*">
    		<xsl:copy>
    			<xsl:apply-templates select="node()|@*"/>
    		</xsl:copy>
    	</xsl:template>
     
        <xsl:template match="common:Declarant">
    		<xsl:element name="common:{local-name()}">
    			<xsl:apply-templates select="@*|node()"/>
    		</xsl:element>  
    	</xsl:template> 
    </xsl:stylesheet>
    Super ! Je suis content d'avoir trouvé mais ce fut laborieux et je ne suis pas trop sûr d'avoir tout compris Je vais relire les cours et tutoriels de Developpez mais si qqun passe par ici et est inspiré par une explication appropriée à cet exemple, ce sera avec grand plaisir que je la lirai.

    Merci et Bonne Journée,

  3. #3
    Membre émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    Par défaut
    Non, je ne pense pas c'est une solution pour la question announcée??? Pour y arriver, on peut faire comme ça.

    [1] xslt 1:0
    [1.1] Si on ne s'est pas gené de déclarer explicitement le namespace ...IntraConsignment avec un préfix un peu arbitraire, dit ns, on fait ceci.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:common="http://www.xyz.com/InputCommon"
        xmlns:ns="http://www.xyz.com/IntraConsignment">
    <!-- etc etc -->
    <xsl:template match="*[parent::ns:Declarant]">
       <!-- etc -->
    </xsl:template>
    </xsl:stylesheet>
    [1.2] Si on ne veut pas le déclarer explicitement, on peut faire ça.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:common="http://www.xyz.com/InputCommon">
    <!-- etc etc -->
    <xsl:template match="*[parent::*[local-name()='Declarant']]">
       <!-- etc -->
    </xsl:template>
    </xsl:stylesheet>
    [2.] xslt 2.0
    Un wildcard de namespace s'est fait disponible dans xslt 2.0, et on peut aussi le faire comme ça avec un moteur xslt 2.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:common="http://www.xyz.com/InputCommon">
    <!-- etc etc -->
    <xsl:template match="*[parent::*:Declarant]">
       <!-- etc -->
    </xsl:template>
    </xsl:stylesheet>
    Voilà !

  4. #4
    Membre confirmé
    Inscrit en
    Février 2011
    Messages
    465
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 465
    Points : 549
    Points
    549
    Par défaut
    Formidable !
    Merci.

    Entretemps, je viens juste de trouver presque la même chose que votre solution 1.2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:template match="*[ancestor::*[local-name()='Declarant']]">
    J'aime bien votre solution 1.1 : prendre l'initiative de définir un namespace avec l'abbréviation ns puis d'utiliser ce namespace dans le xpath. Pas mal du tout ! Je suis impressionné.

    J'adore quand j'appends de nouveaux trucs. C'est chouette !

    Merci.

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 26/04/2006, 16h36
  2. Cacher certains éléments d'un site lors de l'impression
    Par beegees dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 04/04/2006, 16h56
  3. [JTree] Cacher certains éléments ...
    Par JamesP dans le forum Composants
    Réponses: 5
    Dernier message: 15/02/2006, 19h16
  4. [DOM] ajouter le préfixe <?xml-stylesheet>
    Par phoebe dans le forum Format d'échange (XML, JSON...)
    Réponses: 5
    Dernier message: 29/03/2004, 11h37
  5. Ajout d'attribut à l'élément "Body"
    Par Tirlibibi dans le forum XMLRAD
    Réponses: 2
    Dernier message: 07/04/2003, 15h52

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