2010-11-05 4 views
0

Je me bats avec ce qui devrait être un simple XSL: Copiez le updateResponse du message ci-dessous (note: Je dois syntaxe XPath 1.0 pour ma compatibilité du système d'intégration):XPATH Challenge - Vous souhaitez copier un élément intérieur

<?xml version="1.0" encoding="UTF-8"?> 
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns="urn:enterprise.soap.sforce.com" xmlns:n="urn:enterprise.soap.sforce.com"> 
    <soapenv:Body> 
     <updateResponse> 
      <result> 
       <id>001S000000J1Bu0IAF</id> 
       <success>true</success> 
      </result> 
     </updateResponse> 
    </soapenv:Body> 
</soapenv:Envelope> 

Je veux simplement la structure de résultat soit:

<updateResponse xmlns="urn:enterprise.soap.sforce.com"> 
    <result> 
     <id>001S000000J1Bu0IAF</id> 
     <success>true</success> 
    </result> 
</updateResponse> 

Je suis en mesure de copier les objets de savon, mais je ne suis pas réussi à copier les enfants du soapenv: élément du corps. La première copie de fonctionne pour Body, mais la seconde ne résout pas le XPATH. Mon éditeur de requêtes xpath de l'outil XMLSPY dit que xpath est valide, mais le XSL ne se résout pas.

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:urn="enterprise.soap.sforce.com" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> 
    <xsl:namespace-alias stylesheet-prefix="soapenv" result-prefix="foo"/> 
    <xsl:template match="/"> 
     <xsl:apply-templates select="/soapenv:Envelope/soapenv:Body/urn:updateResponse"/> 
    </xsl:template> 

    <xsl:template match="/soapenv:Envelope/soapenv:Body/urn:updateResponse"> 
     <xsl:copy-of select="."/> 
    </xsl:template> 
</xsl:stylesheet> 
+0

Quelles expressions avez-vous essayé qui n'ont pas fonctionné? –

Répondre

1

Vos espaces de noms ne correspondent pas entre vos données et votre feuille de style, qui semble être le seul problème .

Dans votre document stylesheet, changer ceci:

xmlns:urn="enterprise.soap.sforce.com" 

à ceci:

xmlns:urn="urn:enterprise.soap.sforce.com" 

Ensuite, il correspondra à la namespaces déclarés dans votre fichier d'entrée d'origine.

0

Les espaces de noms dans ce document sont étranges; vous avez xmlns et xmlns: n tous deux affectés au même espace de noms. Il semble que //soapenv:updateResponse devrait fonctionner. Avez-vous essayé cela?

1

Cette feuille de style:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> 
    <xsl:template match="/soapenv:Envelope/soapenv:Body//*"> 
     <xsl:element name="{local-name()}" 
        namespace="urn:enterprise.soap.sforce.com"> 
      <xsl:apply-templates/> 
     </xsl:element> 
    </xsl:template> 
</xsl:stylesheet> 

Sortie:

<updateResponse xmlns="urn:enterprise.soap.sforce.com"> 
    <result> 
     <id>001S000000J1Bu0IAF</id> 
     <success>true</success> 
    </result> 
</updateResponse> 

Remarque: Tout d'abord, la déclaration d'espace de noms dans votre feuille de style est erroné. Ce devrait être xmlns:urn="urn:enterprise.soap.sforce.com". En second lieu, pour un résultat exact que vous devez enlever dans les espaces de noms de portée (il y a trois: xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/", xmlns="urn:enterprise.soap.sforce.com" (par défaut), et xmlns:n="urn:enterprise.soap.sforce.com)

Questions connexes