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 :

Transformer des requêtes SOAP avec XSL


Sujet :

XSL/XSLT/XPATH XML

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    247
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 247
    Par défaut Transformer des requêtes SOAP avec XSL
    Bonjour, j'aimerais avec une feuille de style XSL pouvoir parser une requête SOAP.

    Mais les préfixes de namespaces me dérangent.

    Par exemple voici une requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <?xml version="1.0" encoding="UTF-8" standalone="no" ?>
    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns="http://localhost/wsdl/orange.xsd">
       <soapenv:Header/>
       <soapenv:Body>
          <tag1>
          </tag1>
       </soapenv:Body>
    </soapenv:Envelope>
    J'aimerais dans mon template faire un match directement sur la balise tag1.

    Merci pour votre aide

    J'y arrive en faisant ceci
    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 version="1.0"
    		xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    		xmlns="http://localhost/wsdl/orange.xsd"
    		xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> 
    	<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    	<xsl:template match="soapenv:Envelope/soapenv:Body/tag1/">
    		<request>
    			<customerId>
    				<xsl:if test="soapenv:Envelope/soapenv:Body/tag1/@ParameterName='FILTERVALUE'">
    							<xsl:value-of select="soapenv:Envelope/soapenv:Body/tag1"/>
    				</xsl:if>
    			</customerId>
    										</request>
    	</xsl:template>
    </xsl:stylesheet>
    Par contre tous les balises que je souhaite créer n'apparaissent pas dans le fichier de sortie, ce qui me donne le fichier suivant.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <?xml version="1.0" encoding="UTF-8"?>
    1234
    Alors qje je devrais avoir ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <?xml version="1.0"?>
    <request>
     
           <customerId>1234</customerId>
     
    </request>
    Merci pour votre aide

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

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

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

    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" standalone="yes"?>
     
    <soapenv:Envelope 
      xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
      xmlns="http://localhost/wsdl/orange.xsd">
     
       <soapenv:Header/>
     
       <soapenv:Body>
          <tag1>1234</tag1>
       </soapenv:Body>
     
    </soapenv:Envelope>

    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
    <?xml version="1.0" encoding="UTF-8"?>
     
    <xsl:stylesheet version="1.0" 
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  
      xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
      exclude-result-prefixes="soapenv">
     
      <xsl:output indent="yes"/>
     
      <xsl:template match="*[namespace-uri()='http://localhost/wsdl/orange.xsd']">
        <request>
          <customerId>       
            <xsl:value-of select="."/>     
          </customerId>
        </request>
      </xsl:template>
     
    </xsl:stylesheet>

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <?xml version="1.0" encoding="UTF-8"?>
     
    <request>
      <customerId>1234</customerId>
    </request>

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    247
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 247
    Par défaut
    Merci,

    je ne connaissais pas cette fonction.
    Mais du coup je suis un peu déboussolé pour la navigation.
    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
     
    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
     
    <soapenv:Envelope 
      xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
      xmlns="http://localhost/wsdl/orange.xsd">
     
       <soapenv:Header/>
     
       <soapenv:Body>
          <tag1>
                <tag2>
                        une info
                </tag2>
          </tag1>
     
       </soapenv:Body>
     
    </soapenv:Envelope>
    J'aimerais toujours faire un match sur le tag1, comment récupérer la valeur du tag2 ensuite ?

    J'ai essayé avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:value-of select="./tag2"/>
    mais ça ne fonctionne pas

    Merci

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

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

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

    pourrais tu nous faire passer un code XSLT plus complet ?
    Par là, on ne sait vraiment pas où tu as inséré l'élément xsl:value.

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    247
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 247
    Par défaut
    Ok voici un exemple proche de la réalité, ce sera effectivement plus facile pour tous.
    Voici une requete soap typique
    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" standalone="no" ?>
    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns="http://localhost/wsdl/orange.xsd">
    	<soapenv:Header/>
    	<soapenv:Body>
    		<ServiceRequest>
    			<SenderID>BWKABIRAADAPTOR</SenderID>
    			<RequestID>PRP4279415</RequestID>
    			<OrderID>PRP</OrderID>
    			<Filters>
    				<Parameter ParameterName="PARAMNAME">1234</Parameter>
    			</Filters>
    			<ProductAndServiceReq>
    				<ServiceID>Toto</ServiceID>
    				<Verbose>ACT</Verbose>
    				<OrderID>P007</OrderID>
    				<ConfParameters>
    					<TargParameters>
    						<Parameter ParameterName="AAA">1234</Parameter>
    						<Parameter ParameterName="BBB">5678</Parameter>
    						<Parameter ParameterName="CCC">4321</Parameter>
    						<Parameter ParameterName="DDD">8765</Parameter>		
    					</TargParameters>
    				</ConfParameters>
    			</ProductAndServiceReq>
    		</ServiceRequest>
    	</soapenv:Body>
    </soapenv:Envelope>
    Par contre dans le XSL, je souhaiterai faire un seul template (pas d'appels à d'autres). J'aimerais donc matcher sur <ServiceRequest> et naviguer ensuite à partir de là.

    Merci encore pour votre aide


    [EDIT]
    j'ai préfixé par ns: et ça marche.

    Merci infiniement
    [/EDIT]

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

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

    Informations forums :
    Inscription : Octobre 2009
    Messages : 1 460
    Par défaut
    les xpaths dans xslt ne reconnaissent pas le concept de l'espace de nom défaut: il faut toujours le mettre à l'explicite avec un préfixe qui est pourtant quelque peu arbitraire.
    Effectivement, après, avec XSL 2.0, ce n'est pas le cas.

  7. #7
    Membre Expert Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Par défaut
    Les balises tag1, tag2 etc dans le xml document vivent dans l'espace "http://localhost/wsdl/orange.xsd" dites défaut, tandis que les xpaths dans xslt ne reconnaissent pas le concept de l'espace de nom défaut: il faut toujours le mettre à l'explicite avec un préfixe qui est pourtant quelque peu arbitraire.

    Par exemple; le xml document:
    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" standalone="no" ?>
    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns="http://localhost/wsdl/orange.xsd">
        <soapenv:Header/>
        <soapenv:Body>
            <tag1 ParameterName='FILTERVALUE'>
                <tag2>une info</tag2>
            </tag1>
            <tag1 ParameterName='FILTERVALUE2'>
                <tag2>une info2</tag2>
            </tag1>
            <tag1 ParameterName='FILTERVALUE'>
                <tag2>une info3</tag2>
            </tag1>
        </soapenv:Body>
    </soapenv:Envelope>
    Le xslt peut s'écrire comma ça.
    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"?>
    <xsl:stylesheet version="1.0"
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns:ns="http://localhost/wsdl/orange.xsd"
        xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
        exclude-result-prefixes="ns soapenv"
    > 
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    <xsl:strip-space elements="*" />
    <xsl:template match="/soapenv:Envelope/soapenv:Body">
        <request>
            <xsl:apply-templates select="ns:tag1" />
        </request>
    </xsl:template>
    <xsl:template match="ns:tag1">
        <xsl:if test="@ParameterName='FILTERVALUE'">
            <customerId>
                <xsl:value-of select="ns:tag2"/>
            </customerId>
        </xsl:if>
    </xsl:template>
    </xsl:stylesheet>
    qui en résulte
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <?xml version="1.0" encoding="UTF-8"?>
    <request>
        <customerId>une info</customerId>
        <customerId>une info3</customerId>
    </request>
    Dans le template qui fait le "match" de ns:tag1, vous pouvez certainement mettre la conditionnel de xsl:if comme un prédicat du "match", mais je le laisse dans cette forme pourque vous pouvez garder certainement liberté d'élaborer selon les besoins.

  8. #8
    Membre Expert Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Par défaut
    Effectivement, après, avec XSL 2.0, ce n'est pas le cas.
    C'est xslt 2.0 qui n'est pas la même chose: et si vous voulez un peu plus que une simple déclaration souvent plus déroutant que aidant, voice une possible version de xslt 2.0 avec un minimum de modification sur celle j'ai postée aupravant.
    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"?>
    <xsl:stylesheet version="2.0"
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns:ns="http://localhost/wsdl/orange.xsd"
        xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
        exclude-result-prefixes="ns soapenv"
        xpath-default-namespace="http://localhost/wsdl/orange.xsd"
    > 
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    <xsl:strip-space elements="*" />
    <xsl:template match="/soapenv:Envelope/soapenv:Body">
        <request>
            <xsl:apply-templates select="tag1" />
        </request>
    </xsl:template>
    <xsl:template match="tag1">
        <xsl:if test="@ParameterName='FILTERVALUE'">
            <customerId>
                <xsl:value-of select="tag2"/>
            </customerId>
         </xsl:if>
    </xsl:template>
    </xsl:stylesheet>

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

Discussions similaires

  1. envoyer des requêtes SOAP a un client distant
    Par charouka dans le forum NetBeans
    Réponses: 0
    Dernier message: 30/04/2010, 10h04
  2. Exécuter des requête SQL (avec ou sans PHP) dans javascript
    Par mir540 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 20/11/2009, 10h03
  3. [XSLT][JAVA]Transformation d'un Document avec XSL
    Par amadoulamine1 dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 20/03/2009, 18h39
  4. Réponses: 1
    Dernier message: 28/06/2007, 02h24
  5. Modifier des requêtes Access avec VBA
    Par vuong1 dans le forum Access
    Réponses: 7
    Dernier message: 02/08/2006, 07h09

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