我需要将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
答案 0 :(得分:0)
您的尝试失败的原因是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
属性,并使用它来防止将多余的名称空间声明复制到结果中。