如何在wso2 ESB中动态创建有效负载

时间:2013-06-06 11:11:37

标签: wso2 wso2esb

我正在调用一个wso2 DSS服务,该服务返回如下数据:

<IdentifierCollection xmlns="http://tempuri.org/">
 <Identifier>
        <One>1</One>
    <Two>2</Two>
    <Three>3</Three>
    </Identifier>
</IdentifierCollection>

要调用Dss,我的esb代码是:

<payloadFactory>
            <format>
               <p:GetIdentifier xmlns:p="http://tempuri.org/">
                  <xs:ID xmlns:xs="http://tempuri.org/">$1</xs:ID>
               </p:GetIdentifier >
            </format>
            <args>
               <arg expression="get-property('ID')"/>
            </args>
         </payloadFactory>
         <send receive="ResponseOfGetIdentifier">
            <endpoint key="IdentifierEP"/>
         </send>

现在在我的ResponseOfGetIdentifier序列中,我正在捕获属性中的所有数据

<sequence xmlns="http://ws.apache.org/ns/synapse" name="ResponseOfGetIdentifier">
   <iterate xmlns:ns="http://org.apache.synapse/xsd" xmlns:p="http://tempuri.org/" preservePayload="true" attachPath="//p:EntriesCollection" expression="//p:EntriesCollection/p:Entries" id="IterateForResponse">
      <target>
<sequence>
<property xmlns:ns="http://org.apache.synapse/xsd" xmlns:p="http://tempuri.org" name="ResponseOne" expression="//p:Identifier/p:one" scope="default" type="STRING"/>
<property xmlns:ns="http://org.apache.synapse/xsd" xmlns:p="http://tempuri.org" name="ResponseTwo" expression="//p:Identifier/p:Two" scope="default" type="STRING"/>
<property xmlns:ns="http://org.apache.synapse/xsd" xmlns:p="http://tempuri.org" name="ResponseThree" expression="//p:Identifier/p:Three" scope="default" type="STRING"/>
<payloadFactory>
         <format>
<tns:ProductIdentifier xmlns:tns="http://globalArther.products.com">
<IdentifierProducts>
<Product1>$1</Product1>
<Product2>$2</Product>
<Product3>$3</Product3>
</IdentifierProducts>
</tns:ProductIdentifier>
</format>
<args>
<arg expression="get-property('ResponseOne')"/>
<arg expression="get-property(''ResponseTwo)"/>
<arg expression="get-property('ResponseThree')"/>
</args>
</payloadFactory>
</sequence>
</target>
   </iterate>
</sequence>

由于我的dss响应仅包含一个Identifier节点的迭代,因此上面的代码正在工作,但是当我的标识符节点数超过一个时,即

<IdentifierCollection xmlns="http://tempuri.org/">
 <Identifier>
        <One>1</One>
    <Two>2</Two>
    <Three>3</Three>
    </Identifier>
<Identifier>
        <One>a</One>
    <Two>b</Two>
    <Three>c</Three>
    </Identifier>
</IdentifierCollection>

,因为我的有效负载只能获取一个数据所需的第二个迭代数据,并且只显示单个结果:

<tns:ProductIdentifier xmlns:tns="http://globalArther.products.com">
    <IdentifierProducts>
    <Product1>a</Product1>
    <Product2>b</Product>
    <Product3>c</Product3>
    </IdentifierProducts>
    </tns:ProductIdentifier>

但我希望我的答复为:

<tns:ProductIdentifier xmlns:tns="http://globalArther.products.com">
        <IdentifierProducts>
        <Product1>1</Product1>
        <Product2>2</Product>
        <Product3>3</Product3>
        </IdentifierProducts>
<IdentifierProducts>
        <Product1>a</Product1>
        <Product2>b</Product>
        <Product3>c</Product3>
        </IdentifierProducts>
</tns:ProductIdentifier>

所以现在我的问题是我怎么能这样做,即如何使我的有效载荷动态,即我想在我的有效载荷中添加每个迭代。 期待你的回答。谢谢你提前

1 个答案:

答案 0 :(得分:1)

Payload是一种静态的。您需要使用XSLT介体来实现这一点。也就是说,您必须编写XSLT脚本来生成迭代逻辑。