2

我正在调用将响应 XML 作为转义 XML 嵌入的 Web 服务。我收到了完整的 SOAP 响应,但我只对“转义的 XML”部分 ( <SendMessageResult>) 感兴趣。

我正在尝试编写一个 XSL (1.0) 来检索转义的 XML 并将其取消转义,因此我可以通过其他非 XSLT 组件对其进行处理。

我已经在 StackOverflow 中尝试了其他一些“取消转义”的解决方案,但没有运气。

来自 Web 服务的响应

<?xml version="1.0" encoding="UTF-8"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
    <s:Body>
        <SendMessageResponse xmlns="http://www.company.com/CAIS">
            <SendMessageResult>&lt;?xml version="1.0"?&gt;&lt;IEXInboundServiceResponse&gt;&lt;IEXInboundServiceResponseVersion&gt;1.0&lt;/IEXInboundServiceResponseVersion&gt;&lt;ServiceResponse&gt;IEX_SUCCESS&lt;/ServiceResponse&gt;&lt;RequestMessageId&gt;22658651-024E-445B-96C1-94F027205E01&lt;/RequestMessageId&gt;&lt;/IEXInboundServiceResponse&gt;</SendMessageResult>
        </SendMessageResponse>
    </s:Body>
</s:Envelope>

取消转义后所需的输出

<?xml version="1.0"?>
<IEXInboundServiceResponse>
    <IEXInboundServiceResponseVersion>1.0</IEXInboundServiceResponseVersion>
    <ServiceResponse>IEX_SUCCESS</ServiceResponse>
    <RequestMessageId>22658651-024E-445B-96C1-94F027205E01</RequestMessageId>
</IEXInboundServiceResponse>

我正在使用的当前 XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" version="1.0" indent="yes" omit-xml-declaration="yes"/>
    
    <xsl:template match="//SendMessageResult">
        <xsl:value-of select="." disable-output-escaping="yes" />
    </xsl:template>
    
</xsl:stylesheet>
4

1 回答 1

2

问题是处理您正在使用的命名空间。首先,您还没有http://www.company.com/CAIS在 XSLT 中声明 namspace。您可以通过将第一行更改为:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                 xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"
                 xmlns:c="http://www.company.com/CAIS">

注意最后一个命名空间。我尝试使用空白命名空间,但它仍然存在与您相同的问题。

然后将模板的开头行更改为:

<xsl:template match="//c:SendMessageResult">

然后它应该按预期工作。

于 2013-11-28T04:40:25.693 回答