Как преобразовать SOAP-ответ в более простой XML - PullRequest
0 голосов
/ 29 октября 2019

Мне нужно преобразовать ответ SOAP в формат POX. Я пытался некоторое время, но я вырываю, какие маленькие волосы у меня остались. Мой SOAP

<?xml version="1.0" encoding="UTF-8"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
   <s:Body>
      <GetSpecialtiesResponse xmlns="http://tempuri.org/">
         <GetSpecialtiesResult xmlns:a="http://schemas.datacontract.org/2004/07/WsAgenda.DataContracts" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
            <a:Specialty>
               <a:code>cardiology</a:code>
               <a:name>Cardiologie</a:name>
            </a:Specialty>
            <a:Specialty>
               <a:code>neurology</a:code>
               <a:name>Neurologie</a:name>
            </a:Specialty>
            <a:Specialty>
               <a:code>urology</a:code>
               <a:name>Urologie</a:name>
            </a:Specialty>
            <a:Specialty>
               <a:code>physiotherapy</a:code>
               <a:name>Physiothérapie</a:name>
            </a:Specialty>
         </GetSpecialtiesResult>
      </GetSpecialtiesResponse>
   </s:Body>
</s:Envelope>

мой XSLT к настоящему времени

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://tempuri.org/" xmlns:a="http://schemas.datacontract.org/2004/07/WsAgenda.DataContracts" xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" version="1.0">
   <xsl:output method="xml" omit-xml-declaration="yes" encoding="utf-8" indent="yes" />
   <xsl:template match="/">
      <specialties>
         <xsl:for-each select="s:Envelope/s:Body/GetSpecialtiesResponse/GetSpecialtiesResult/a:Specialty">
            <specialty>
               <id>
                  <xsl:value-of select="a:code" />
               </id>
               <description>
                  <xsl:value-of select="a:name" />
               </description>
            </specialty>
         </xsl:for-each>
      </specialties>
   </xsl:template>
</xsl:stylesheet>

и желаемый выходной файл:

<specialties>
    <specialty>
        <id>cardiology</id>
        <description>Cardiologie</description>
    </specialty>
</specialties>

Я не могу заставить его работать,Пожалуйста, помогите мне, я умираю ... Я уверен, что это что-то глупое, так как я не привык манипулировать XML

1 Ответ

0 голосов
/ 29 октября 2019

Причина, по которой ваша попытка не работает, заключается в том, что GetSpecialtiesResponse и GetSpecialtiesResult также находятся в пространстве имен, даже если у них нет префикса.

Если вы измените объявление пространства имен:

xmlns="http://tempuri.org/" 

на:

xmlns:t="http://tempuri.org/"  

и выполните:

<xsl:for-each select="s:Envelope/s:Body/t:GetSpecialtiesResponse/t:GetSpecialtiesResult/a:Specialty">

, вы получите (почти) результат, который вы хотите. В остальном добавьте атрибут exclude-result-prefixes к вашему элементу xsl:stylesheet и используйте его для предотвращения копирования избыточных объявлений пространства имен в результат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...