XSLT程序将源转换为目标

时间:2017-05-31 16:25:43

标签: xml xslt soap xslt-1.0

我对xslt没有经验,因此请求帮助解决我的问题。

基本上我向第三方服务发送肥皂请求,我收到以下回复

第三方对成功消息的回复

<?xml version="1.0" encoding="UTF-8"?>
<nm:Response xmlns:nm="http://fsag.de/BusinessTransaction">
<BTEMessage>
  <InOrderContext>
     <SendTimestamp>01-06-2017:0506230000</SendTimestamp>
  </InOrderContext>
  <SystemContext>
    <Client>FDP</Client>
    <CorrelationId>34553FTG25543SFD134</CorrelationId>
    <BusinessContext>RECONCL</BusinessContext>
  </SystemContext>
</BTEMessage>

但是当xml出现故障时,webservice将返回soap soap fault,如下所示:

来自第三方的错误消息

<?xml version="1.0" encoding="UTF-8"?>
<nm:Response xmlns:nm="http://fsag.de/BusinessTransaction">
<env:Envelope  xmlns:env="http://www.w3.org/2001/12/soap-envelope" >
    <env:Body>
        <env:Fault>

          <env:Code>
            <env:Value>env:Sender</env:Value>
          </env:Code>

          <env:Reason>
            <env:Text xml:lang="en-US">Processing error</env:Text>
            <env:Text xml:lang="da">Processerings-fejl</env:Text>
          </env:Reason>

        </env:Fault>
    </env:Body>
</env:Envelope>
</nm:Response>

所以基本上我需要有一个XSLT程序来生成如下目标:

如果没有错误消息目标为:

<?xml version="1.0" encoding="UTF-8"?>
<nm:BTEMessage xmlns:nm="http://fsag.de/BusinessTransaction">
  <InOrderContext>
     <SendTimestamp>20170601095410 </SendTimestamp>
  </InOrderContext>
  <SystemContext>
    <Client>BTD</Client>
    <CorrelationId>C67DCFBC3C031ED791D3F050E6E1C0DA</CorrelationId>
    <BusinessContext>Collections</BusinessContext>
  </SystemContext>
</nm:BTEMessage>

但如果返回SOAP错误,则目标为

    <?xml version="1.0" encoding="UTF-8"?>
    <nm:Response xmlns:nm="http://fsag.de/BusinessTransaction">
    <BTEMessage>
      <InOrderContext>
         <SendTimestamp></SendTimestamp>
      </InOrderContext>
      <SystemContext>
        <Client></Client>
        <CorrelationId></CorrelationId>
        <BusinessContext></BusinessContext>
      </SystemContext>
    </BTEMessage>
    <env:Envelope  xmlns:env="http://www.w3.org/2001/12/soap-envelope" >
        <env:Body>
            <env:Fault>
              <env:Code>
                <env:Value>env:Sender</env:Value>
              </env:Code>
             <env:Reason>
     <env:Text xml:lang="en-US">Processing error</env:Text>
            <env:Text xml:lang="da">Processerings-fejl</env:Text>
          </env:Reason>
        </env:Fault>
    </env:Body>
    </env:Envelope>
    </nm:Response>

请在这里提供帮助吗?

到目前为止,我可以让它移动,因为不知道在xslt中考虑我的非常少的exp在哪里以及如何开始。此处理在SAP中执行,并且SAP提供XSL程序的兼容性,我认为这将实现。

1 个答案:

答案 0 :(得分:1)

您可以为每种情况使用不同的模板:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:nm="http://fsag.de/BusinessTransaction"
xmlns:env="http://www.w3.org/2001/12/soap-envelope" 
exclude-result-prefixes="env">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:template match="/nm:Response[BTEMessage]">
    <nm:BTEMessage>
        <xsl:copy-of select="BTEMessage/*"/>
    </nm:BTEMessage>    
</xsl:template>

<xsl:template match="/nm:Response[env:Envelope]">
    <xsl:copy>
        <BTEMessage>
            <InOrderContext>
                <SendTimestamp/>
            </InOrderContext>
            <SystemContext>
                <Client/>
                <CorrelationId/>
                <BusinessContext/>
            </SystemContext>
        </BTEMessage>
        <xsl:copy-of select="env:Envelope"/>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>