Все приведенные выше примеры XML представляют собой эквивалентные информационные наборы. Они равны , учитывая все обстоятельства. Различия влияют только на сериализованную (текстовую) форму, поэтому они не должны вас беспокоить.
Если я вас правильно понял, вы хотите получить эти два значения:
Чтобы получить эти значения в XSLT, используйте:
<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>
Если вы не в XSLT, то для получения имени операции необходимо выбрать правильный узел и запросить у DOM URI пространства имен. Псевдо-код:
dom.registerNSPrefix("soapenv", "http://schemas.xmlsoap.org/soap/envelope/");
ret = dom.selectSingleNode("/soapenv:Envelope/soapenv:Body/*[1]");
nsUri = ret.namespaceURI;
opName = nsUri.replace(".*/", ""); // whatever