SOAP请求中CDATA标记内的ESB代理XML请求

时间:2018-12-13 20:00:23

标签: wso2 wso2esb synapse

我是Apache Synapse的新手。我需要对SOAP服务进行基于内容的路由和代理。但是,实际的请求是SOAP请求正文中CDATA标记内的XML文档。根据该文档的内容进行路由后,我需要使用XQuery中介程序来转换文档并调用代理服务。我无法更改此请求的WSDL。是否可以对CDATA标记内的文档进行路由和转换?当我从Synapse记录请求时,我看到CDATA中的XML已被转义。我看过一些描述保存CDATA的帖子,但是我不确定在任何情况下都可以使用它。

该请求如下所示。我需要根据TypeOfRequest属性路由消息:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:svc="http://integration.myservice.com">
   <soapenv:Header/>
   <soapenv:Body>
      <svc:Execute>
         <svc:myservice>
             <![CDATA[
             <?xml version="1.0" encoding="UTF-8"?>
            <myservice xmlns="http://integration.myservice.com">
                <Request TypeOfRequest="type1" RequestID="1" Echo="false">
                    <Message>
                        <Tag1510>
                            <TypeCode>10</TypeCode>
                            <SubTypeCode>00</SubTypeCode>
                        </Tag1510>
                        <Tag2000>
                            <Amount>
                                <Amount>1.00</Amount>
                            </Amount>
                        </Tag2000>
                    </Message>
                </Request>
            </myservice>
            ]]>
        </svc:myservice>
      </svc:Execute>
   </soapenv:Body>
</soapenv:Envelope> 

1 个答案:

答案 0 :(得分:1)

通常,您可以使用xslt删除CDATA块。在这种情况下,<?xml ..?>会造成麻烦,但是我认为我使用substring设法解决了该问题,但仍然无法对其进行测试(编辑:但是根据下面的反馈,它可以工作) https://xsltfiddle.liberty-development.net/pPqsHUz/1

一种替代方法是使用脚本介体在javascript中做一些字符串魔术来提取myservice和/ myservice之间的部分

编辑:我已经在下面添加了XSLT,以防xsltfiddle链接停止工作:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="2.0" xmlns:svc="http://integration.myservice.com"
    xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">

  <!-- match all elements that are not 'svc:myservice' and ignore -->
  <xsl:template match="@* | node()">
        <xsl:apply-templates select="@* | node()"/>
  </xsl:template>

  <!-- match svc:myservice and copy the entire CDATA string after the ?xml line -->
  <xsl:template match="svc:myservice">
     <xsl:copy>
       <xsl:value-of select="substring-after(., '?>')" disable-output-escaping="yes"/>
     </xsl:copy>
  </xsl:template>
</xsl:stylesheet>