2009-07-21 15 views
0

Ich muss eine generische Vorlage schreiben, um einen Operationsnamen und den Namespace dafür aus einer Soap-Antwort zu finden. Generisch ich meine, das gilt für jede Operation. Daher kenne ich den Namen der Operation und den Namen des Namensraums nicht, möchte sie aber abrufen und ändern, wenn ich die Antwort sende. HierAbfrage auf XPATH-Anweisung

ist die Struktur der Antwort:

Typs 1: Namensraum für den Betrieb ist definiert in <soapenv:Envelope>:

<soapenv:Envelope 
    xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
    xmlns:inf="http://bad.com/abc/infrastructure" 
    xmlns:ret="http://bad.com/FirstOperationToExecute" 
    xmlns:com="http://bad.com/commercial"> 
    <soapenv:Header/> 
    <soapenv:Body> 
    <ret:retrieveSummaryRequest> 
     <!-- ... result ... --> 
    </ret:retrieveSummaryRequest> 
    </soapenv:Body> 
</soapenv:Envelope> 

Typ 2: Namensraum in dem Elemente definiert <ret:retrieveSummaryRequest>:

<soapenv:Envelope 
    xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
    xmlns:inf="http://bad.com/abc/infrastructure" 
    xmlns:ret="http://bad.com/FirstOperationToExecute" 
    xmlns:com="http://bad.com/commercial"> 
    <soapenv:Header/> 
    <soapenv:Body> 
    <ret:retrieveSummaryRequest xmlns:ret="http://bad.com/FirstOperationToExecute" > 
     <!-- ... result ... --> 
    </ret:retrieveSummaryRequest> 
    </soapenv:Body> 
</soapenv:Envelope> 

Typ 3: Standardnamespace in <retrieveSummaryRequest>:

<soapenv:Envelope 
    xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
    xmlns:inf="http://bad.com/abc/infrastructure" 
    xmlns:ret="http://bad.com/FirstOperationToExecute" 
    xmlns:com="http://bad.com/commercial"> 
    <soapenv:Header/> 
    <soapenv:Body> 
    <retrieveSummaryRequest xmlns="http://bad.com/FirstOperationToExecute" > 
     <!-- ... result ... --> 
    </retrieveSummaryRequest> 
    </soapenv:Body> 
</soapenv:Envelope> 

Kann mir jemand helfen zu sagen, ob es eine einfache XPath-Anweisung dafür gibt, um den Operationsnamen und den Namespace zu erhalten.

Antwort

0

Alle obigen XML-Beispiele stellen entsprechende Infosets dar. Sie sind gleich, alles in allem betrachtet. Die Unterschiede wirken sich nur auf die serialisierte (Text-) Form aus, daher sollten sie Sie nicht stören.

Wenn ich Sie recht verstehe, wollen Sie diese beiden Werte abzurufen:

  • "http://bad.com/FirstOperationToExecute"
  • "FirstOperationToExecute"

zu halten, diese Werte in XSLT zu erhalten, verwenden Sie:

<xsl:template match="ret:retrieveSummaryRequest"> 
    <!-- the full URI --> 
    <xsl:value-of select="namespace-uri()" /> 

    <!-- the operation name only --> 
    <xsl:value-of select=" 
    substring-after(
     substring-after(namespace-uri(), '//'), 
     '/' 
    ) 
    " /> 
</xsl:template> 

Wenn Sie nicht in XSLT sind, dann Abrufen der Operation na Mir geht es darum, den richtigen Knoten auszuwählen und das DOM nach dem Namespace-URI zu fragen. Pseudocode:

dom.registerNSPrefix("soapenv", "http://schemas.xmlsoap.org/soap/envelope/"); 
ret = dom.selectSingleNode("/soapenv:Envelope/soapenv:Body/*[1]"); 
nsUri = ret.namespaceURI; 
opName = nsUri.replace(".*/", ""); // whatever