如何在WSO2ESB中动态转换消息

时间:2014-05-15 05:39:48

标签: xslt xpath wso2 xquery wso2esb

我正在使用wso2esb4.8.0 我希望使用wso2esb转换消息.Actaulle需要将复杂元素添加到Payload
我怎么会这样做呢? 我的客户请求是

<?xml version="1.0" encoding="UTF-8"?>

但是我的适配器端点将允许这种格式的请求。如果它是一个操作,我可以跟随有效负载调解器来发出我的请求但是这些是请求的bumch 所以端点允许请求是

只需提取 Operation_Name 并将其添加为复杂元素但是我无法做到这一点我在这样的代理中尝试

代理是

<?xml version="1.0" encoding="UTF-8"?>
<proxy xmlns="http://ws.apache.org/ns/synapse"
       name="SamplePOC7"
       transports="https,http"
       statistics="disable"
       trace="disable"
       startOnLoad="true">
   <target>
      <inSequence>
         <property xmlns:open="http://www.openuri.org/"
                   xmlns:ns="http://org.apache.synapse/xsd"
                   xmlns:env="http://eai.mmn.mm/Envelope"
                   xmlns:poin="http://eai.mm.mm/gg"
                   name="Operation_Name"
                   expression="//poin:Operation_Name/text()"
                   scope="default"
                   type="STRING"/>
         <property xmlns:open="http://www.openuri.org/"
                   xmlns:ns="http://org.apache.synapse/xsd"
                   xmlns:env="http://eai.mmn.xxxx/Envelope"
                   name="AddElement"
                   expression="concat('open:',get-property('Operation_Name'))"
                   scope="default"
                   type="STRING"/>
         <enrich>
            <source xmlns:env="http://eai.mmn.mm/Envelope"
                    clone="true"
                    xpath="//env:Payload/*"/>
            <target xmlns:poin="http://eai.mm.XXX/gg"
                    xpath="concat('open:',//poin:Operation_Name/text())"/>
         </enrich>
         <log level="full">
            <property name="Message" expression="get-property('AddElement')"/>
         </log>
      </inSequence>
      <outSequence/>
   </target>
   <description/>
</proxy>

但它给出的错误如下面的错误日志是

[2014-05-15 10:53:48,167]  INFO - ProxyService Successfully created the Axis2 se
rvice for Proxy service : SamplePOC7
[2014-05-15 10:53:53,089] ERROR - EnrichMediator Invalid Target object to be enr
ich.
[2014-05-15 10:54:19,160]  INFO - ProxyService Building Axis service for Proxy s

如果您知道粘贴配置或者提供任何示例,我可以根据自己的方式提取此请求。

提前致谢

1 个答案:

答案 0 :(得分:1)

您可以使用XSLT介体或JavaScript

使用javascript执行您想要的示例代理:

<?xml version="1.0" encoding="UTF-8"?>
<proxy xmlns="http://ws.apache.org/ns/synapse"
       name="TestSOF"
       transports="http"
       startOnLoad="true"
       trace="disable">
   <description/>
   <target>
      <inSequence>
         <property name="FORCE_SC_ACCEPTED" value="true" scope="axis2"/>
         <property xmlns:open="http://www.openuri.org/"
                   xmlns:ns="http://org.apache.synapse/xsd"
                   xmlns:poin="http://eai.mtn.iran/PointOfSales"
                   name="Operation_Name"
                   expression="//poin:Operation_Name/text()"
                   scope="default"
                   type="STRING"/>
         <property xmlns:ns="http://org.apache.synapse/xsd"
                   xmlns:poin="http://eai.mtn.iran/PointOfSales"
                   name="PointOfSales"
                   expression="//poin:PointOfSales"
                   scope="default"
                   type="STRING"/>
         <script language="js"><![CDATA[
                mc.setPayloadXML(<open:{mc.getProperty("Operation_Name")} xmlns:open="http://www.openuri.org/">
                                   {new XML(mc.getProperty("PointOfSales"))}
                                 </open:{mc.getProperty("Operation_Name")}>);
      ]]></script>
         <log level="full"/>
      </inSequence>
   </target>
</proxy>

使用XSLT的示例:

<?xml version="1.0" encoding="UTF-8"?>
<localEntry xmlns="http://ws.apache.org/ns/synapse" key="SOFXSL">
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                           xmlns:xs="http://www.w3.org/2001/XMLSchema"
                           xmlns:fo="http://www.w3.org/1999/XSL/Format"
                           xmlns:fn="http://www.w3.org/2005/xpath-functions"
                           xmlns:open="http://openuri.org/"
                           xmlns:env="http://eai.mtnn.iran/Envelope"
                           xmlns:poin="http://eai.mtn.iran/PointOfSales"
                           version="2.0">
        <xsl:output method="xml" encoding="utf-8" indent="yes" omit-xml-declaration="no"/>
        <xsl:param name="operationname"/>
        <xsl:template match="/">
            <xsl:element name="open:{$operationname}">
                <xsl:apply-templates select="//poin:PointOfSales"/>
            </xsl:element>
        </xsl:template>
        <xsl:template match="@*|*|comment()">
            <xsl:copy>
                <xsl:apply-templates select="@*|*|text()|comment()|processing-instruction()"/>
            </xsl:copy>
        </xsl:template>
    </xsl:stylesheet>
   <description/>
</localEntry>


<?xml version="1.0" encoding="UTF-8"?>
<proxy xmlns="http://ws.apache.org/ns/synapse"
       name="TestSOF"
       transports="http"
       startOnLoad="true"
       trace="disable">
   <description/>
   <target>
      <inSequence>
         <property name="FORCE_SC_ACCEPTED" value="true" scope="axis2"/>
         <property xmlns:open="http://www.openuri.org/"
                   xmlns:ns="http://org.apache.synapse/xsd"
                   xmlns:poin="http://eai.mtn.iran/PointOfSales"
                   name="Operation_Name"
                   expression="//poin:Operation_Name/text()"
                   scope="default"
                   type="STRING"/>
         <xslt key="SOFXSL">
            <property name="operationname" expression="get-property('Operation_Name')"/>
         </xslt>
         <log level="full"/>
      </inSequence>
   </target>
</proxy>