【问题标题】:How to handle SOAP FAULT in response using XSLT如何使用 XSLT 处理 SOAP FAULT 响应
【发布时间】:2014-05-08 01:47:54
【问题描述】:

我在 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 错误

【问题讨论】:

  • 您的当前 XSLT 只是使用作为响应接收的 SOAP 信封复制 RetrieveDataResponse XMl。你为什么要为此使用 XSLT?

标签: xml xslt soap xslt-1.0 mule


【解决方案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>

有点冗长,但你明白了。它没有做太多的转变。通常,您会剥离信封,以便处理变得更容易。如果您想抑制特定元素,您始终可以使用&lt;xsl:template match="prefix:element" /&gt; 这将抑制此类元素的所有输出。 Recommended reading.

告诉我们进展如何!

【讨论】:

  • 它工作得很好......我遇到了一个小问题......我想要如果响应值是“从数据库中检索到的数据”,那么只有像 ID、年龄、姓名和指定这样的属性会显示...但是即使 Response 的值不是那个... Age 和 Id 之类的属性以值 0 显示...我的 wsdl 可能有一些错误,并且相同的值出现在实际的主机 Web 服务响应中.. 这就是我为这个代理选择 XSLT 以防止在响应值不是那个时出现 Id 和 Age 值的原因.. 在您修改后的 xslt 中我也需要停止显示 Age,Id 值..
  • 无论如何.. 感谢您的回复
  • 您可以使用我提到的方法(空模板)将它们混合出来,或者将选择语句添加到应用模板中。欢迎采纳答案
  • 既然你无论如何都在处理,把信封剥掉,所以你实际上只处理你需要的东西。保持代码库干净
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-25
  • 2018-12-17
  • 1970-01-01
  • 2021-03-18
  • 1970-01-01
相关资源
最近更新 更多