2014-05-07 152 views
1

處理SOAP錯誤響應我在騾子代理web服務,我現在用XSLT轉換響應修改響應......它工作正常,並響應有點像: -如何使用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錯誤 ...如果我從響應中刪除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

您的curretn XSLT只是通過SOAP Envelope來重現RetrieveDataResponse XMl,它作爲響應接收。你爲什麼使用XSLT呢? – user1760178

回答

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> 

A l ittle詳細,但你明白了。它沒有做很多轉變。通常情況下,您會剝離信封,因此處理變得更加容易。如果你想壓制一個特定的元素,你總是可以使用<xsl:template match="prefix:element" />這將抑制這樣一個元素的所有輸出。 Recommended reading

讓我們知道它是怎麼回事!

+0

它的工作完美...我得到一個小問題...我希望如果響應值是「從數據庫中檢索數據」,那麼只有像Id,Age,Name和Designation這樣的屬性會顯示......但即使響應的價值不是那麼...類似Age和Id的屬性顯示值爲0 ...這可能是我的wsdl中的一些錯誤,並且實際的主機webservice響應中也會出現相同的值..這就是我選擇XSLT爲這個代理,以防止Id和年齡的值,當響應值不是那個..在這裏也在您修改的xslt我需要停止顯示年齡,Id值.. –

+0

反正..感謝您的回覆 –

+0

你可以融合他們使用我提到的方法(空模板)或將select語句添加到apply-templates。隨時接受答案 – stwissel