Запрос по XPATH - PullRequest
       7

Запрос по XPATH

0 голосов
/ 21 июля 2009

Мне нужно написать общий шаблон для поиска имени операции и пространства имен для этого из мыльного ответа. Я имею в виду, что это применимо к любой операции. Поэтому я не знаю имени операции и имени пространства имен, но хочу получить их и изменить, когда отправляю ответ.

Вот структура ответа:

Тип 1: пространство имен для операции определено в <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>

Тип 2: пространство имен, определенное в элементе <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>

Тип 3: пространство имен по умолчанию в <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>

Может ли кто-нибудь помочь мне сказать, есть ли для этого простой оператор XPath, чтобы получить имя операции и пространство имен.

1 Ответ

0 голосов
/ 21 июля 2009

Все приведенные выше примеры 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
...