我在Mule中有一个代理Web服务,我使用XSLT转换响应来修改响应......它运行正常,响应有点像: -
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<retrieveDataResponse xmlns="http://services.test.com/schema/MainData/V1">
<Response>The Data retrieved from the Database</Response>
<Id>3</Id>
<Name>anir</Name>
<Age>44</Age>
<Designation>SE</Designation>
</retrieveDataResponse>
</soap:Body>
</soap:Envelope>
现在问题是当发生任何SOAP错误时说 UNMARSHAL_ERROR ,响应没有显示SOAP错误......它有点像: -
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<retrieveDataResponse xmlns="http://services.test.com/schema/MainData/V1">
<Response/>
</retrieveDataResponse>
</soap:Body>
</soap:Envelope>
但它应该显示 SOAP Fault ...如果我从响应中删除XSLT它工作正常并显示响应 SOAP Fault ..但是如果我放置XSLT再次它没有显示响应错误..如何修改我的XSLT以便它处理SOAP错误.....我的XSLT如下: -
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:md1="http://services.test.com/schema/MainData/V1"
exclude-result-prefixes="md1">
<xsl:template match="/">
<soap:Envelope>
<soap:Body>
<retrieveDataResponse xmlns="http://services.test.com/schema/MainData/V1">
<Response>
<xsl:value-of
select="soap:Envelope/soap:Body/md1:retrieveDataResponse/md1:Response" />
</Response>
<xsl:if
test="soap:Envelope/soap:Body/md1:retrieveDataResponse/md1:Response='The Data retrieved from the Database'">
<Id>
<xsl:value-of
select="soap:Envelope/soap:Body/md1:retrieveDataResponse/md1:Id" />
</Id>
<Name>
<xsl:value-of
select="soap:Envelope/soap:Body/md1:retrieveDataResponse/md1:Name" />
</Name>
<Age>
<xsl:value-of
select="soap:Envelope/soap:Body/md1:retrieveDataResponse/md1:Age" />
</Age>
<Designation>
<xsl:value-of
select="soap:Envelope/soap:Body/md1:retrieveDataResponse/md1:Designation" />
</Designation>
</xsl:if>
</retrieveDataResponse>
</soap:Body>
</soap:Envelope>
</xsl:template>
</xsl:stylesheet>
请帮助...如何修改我的XSLT以捕获SOAP错误
答案 0 :(得分:1)
我会将XSLT设计得更加模块化,然后逐步采用它:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:md1="http://services.test.com/schema/MainData/V1"
xmlns="http://services.test.com/schema/MainData/V1"
exclude-result-prefixes="md1">
<xsl:template match="/">
<xsl:apply-templates />
<xsl:template>
<xsl:template match="soap:Envelope">
<soap:Envelope>
<xsl:apply-templates />
</soap:Envelope>
</xsl:template>
<xsl:template match="soap:Body">
<soap:Body>
<xsl:apply-templates />
</soap:Body>
</xsl:template>
<xsl:template match="retrieveDataResponse">
<retrieveDataResponse>
<Response>
<xsl:value-of select="Response" />
</Response>
<xsl:if test="Response='The Data retrieved from the Database'">
<Id>
<xsl:value-of select="Id" />
</Id>
<Name>
<xsl:value-of select="Name" />
</Name>
<Age>
<xsl:value-of select="Age" />
</Age>
<Designation>
<xsl:value-of select="Designation" />
</Designation>
</xsl:if>
</retrieveDataResponse>
</xsl:template>
<xsl:template match="*">
<xsl:copy-of select="." />
</xsl:template>
</xsl:stylesheet>
有点冗长,但你明白了。它没有做很多转变。通常,您会剥离信封,以便处理变得更容易。如果要抑制特定元素,则始终可以使用<xsl:template match="prefix:element" />
这将抑制此类元素的所有输出。 Recommended reading
告诉我们它是怎么回事!