我是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>
答案 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>