如何将SOAP响应转换为更简单的XML

时间:2019-10-29 18:16:57

标签: xml xslt

我需要将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 :(得分:0)

您的尝试失败的原因是GetSpecialtiesResponseGetSpecialtiesResult也在命名空间中,即使它们没有前缀也是如此。

如果您更改名称空间声明:

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属性,并使用它来防止将多余的名称空间声明复制到结果中。