2010-12-29 8 views
2

Ich versuche, XSL zu verwenden, um den folgenden WCF Aufruf und das Ergebnis in einer Warteschlange zu transformieren:XSL Verwenden von Werten von WCF SOAP-Nachrichten zu extrahieren

<s:Envelope xmlns:a="http://www.w3.org/2005/08/addressing" xmlns:s="http://www.w3.org/2003/05/soap-envelope"> 
    <s:Header> 
    <a:Action s:mustUnderstand="1">SendMessage</a:Action> 
    <a:MessageID>urn:uuid:19034ce7-c5ce-4670-ac6c-cfef30c245bd</a:MessageID> 
    <a:ReplyTo> 
     <a:Address>http://www.w3.org/2005/08/addressing/anonymous</a:Address> 
    </a:ReplyTo> 
    </s:Header> 
    <s:Body> 
    <SendMessage xmlns="http://my.custom.namespace/2007/12"> 
     <request xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
     <to>Test</to> 
     <from>Test</from> 
     <message>Test</message> 
     <service>Test</service> 
     </request> 
    </SendMessage> 
    </s:Body> 
</s:Envelope> 

Was würde ich zu dem bekommen tun ' zu ',' von ',' Nachricht 'und' Service 'Knoten, aber ich habe Probleme bei der Auswahl darüber hinaus aufgrund der Standard-Namespaces in den Kindknoten verwendet. Kennt jemand die richtige xPath-Abfrage, die ich verwenden sollte, um zu diesen Knoten zu gelangen?

Danke,

Mike

+0

Gute Frage, +1. Siehe meine Antwort für eine vollständige Lösung. –

Antwort

1

Was würde Ich mag es, auf die erhalten tun 'zu', 'aus', 'Nachricht' und 'Service' Knoten, aber ich bin Probleme Auswahl darüber hinaus aufgrund der Standard Namespaces in den untergeordneten Knoten verwendet. Kennt jemand die richtige xPath Abfrage, die ich verwenden sollte, um zu diese Knoten zu bekommen?

Verwendung:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:s="http://www.w3.org/2003/05/soap-envelope" 
xmlns:sb="http://my.custom.namespace/2007/12"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 

<xsl:template match="/"> 
    <xsl:copy-of select= 
    "/*/s:Body/sb:SendMessage/sb:request/*"/> 
</xsl:template> 
</xsl:stylesheet> 

wenn diese Transformation auf der mitgelieferten XML-Dokument angewendet wird:

<s:Envelope xmlns:a="http://www.w3.org/2005/08/addressing" xmlns:s="http://www.w3.org/2003/05/soap-envelope"> 
    <s:Header> 
     <a:Action s:mustUnderstand="1">SendMessage</a:Action> 
     <a:MessageID>urn:uuid:19034ce7-c5ce-4670-ac6c-cfef30c245bd</a:MessageID> 
     <a:ReplyTo> 
      <a:Address>http://www.w3.org/2005/08/addressing/anonymous</a:Address> 
     </a:ReplyTo> 
    </s:Header> 
    <s:Body> 
     <SendMessage xmlns="http://my.custom.namespace/2007/12"> 
      <request xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
       <to>Test</to> 
       <from>Test</from> 
       <message>Test</message> 
       <service>Test</service> 
      </request> 
     </SendMessage> 
    </s:Body> 
</s:Envelope> 

den gewünschten Knoten ausgegeben:

<to xmlns="http://my.custom.namespace/2007/12" xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns:a="http://www.w3.org/2005/08/addressing" xmlns:s="http://www.w3.org/2003/05/soap-envelope">Test</to> 
<from xmlns="http://my.custom.namespace/2007/12" xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns:a="http://www.w3.org/2005/08/addressing" xmlns:s="http://www.w3.org/2003/05/soap-envelope">Test</from> 
<message xmlns="http://my.custom.namespace/2007/12" xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns:a="http://www.w3.org/2005/08/addressing" xmlns:s="http://www.w3.org/2003/05/soap-envelope">Test</message> 
<service xmlns="http://my.custom.namespace/2007/12" xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns:a="http://www.w3.org/2005/08/addressing" xmlns:s="http://www.w3.org/2003/05/soap-envelope">Test</service> 
+0

Perfekt, das hat den Trick gut gemacht. Vielen Dank! – mclark1129

+0

+1 Für eine korrekte Antwort. Außerdem mag ich den "whatever root element" Schritt :) –

Verwandte Themen