Enrich调解器仅适用于WSO2 ESB中的第一个元素5

问题描述:

我正在使用Enrich Mediator来丰富XML。Enrich调解器仅适用于WSO2 ESB中的第一个元素5

我的问题是,它总是适用于第一个元素,但我想将其应用于多个元素。我如何将它应用于XPATH选择的所有元素?

我也试过下面的选项。但失败。

//Response/ResponseDetails/SearchHotelPriceResponse/HotelDetails/Hotel[@HasExtraInfo="true"] 

富民配置:

<enrich> 
    <source type="inline"> 
     <ImageCode xmlns="">IMG10004</ImageCode> 
    </source> 
    <target action="child" xpath="//Response/ResponseDetails/SearchHotelPriceResponse/HotelDetails/Hotel[*]"/> 
</enrich> 

XML有效载荷:

<Response ResponseReference="REF_D_028_749-2801486459143247"> 
    <ResponseDetails Language="en"> 
     <SearchHotelPriceResponse> 
      <HotelDetails> 
       <Hotel HasExtraInfo="true" HasMap="true" HasPictures="true"> 
        <City Code="LON">London</City> 
        <Item Code="ALE1">ALEXANDRA</Item> 
        <StarRating>3</StarRating> 
        <HotelRooms> 
         <HotelRoom Code="SB" NumberOfRooms="1"/> 
        </HotelRooms> 
       </Hotel> 
       <Hotel HasExtraInfo="true" HasPictures="true"> 
        <City Code="LON">London</City> 
        <Item Code="ALO">Aloft London Excel</Item> 
        <StarRating>4</StarRating> 
        <HotelRooms> 
         <HotelRoom Code="SB" NumberOfRooms="1"/> 
        </HotelRooms> 
       </Hotel> 
       <Hotel HasExtraInfo="true" HasMap="true" HasPictures="true"> 
        <City Code="LON">London</City> 
        <Item Code="AMB3">Ambassadors Bloomsbury</Item> 
        <StarRating>4</StarRating> 
        <HotelRooms> 
         <HotelRoom Code="SB" NumberOfRooms="1"/> 
        </HotelRooms> 
       </Hotel> 
      </HotelDetails> 
     </SearchHotelPriceResponse> 
    </ResponseDetails> 
</Response> 
  • ESB 5.0.0

使用“迭代”调解器,请检查我的解决方案。

<?xml version="1.0" encoding="UTF-8"?> 
<proxy xmlns="http://ws.apache.org/ns/synapse" 
     name="EnrichProxy" 
     startOnLoad="true" 
     statistics="disable" 
     trace="disable" 
     transports="http,https"> 
    <target> 
     <inSequence> 
     <payloadFactory media-type="xml"> 
      <format> 
       <Response xmlns="" ResponseReference="REF_D_028_749-2801486459143247"> 
        <ResponseDetails Language="en"> 
        <SearchHotelPriceResponse> 
         <HotelDetails> 
          <Hotel HasExtraInfo="false" HasMap="true" HasPictures="true"> 
           <City Code="LON">London</City> 
           <Item Code="ALE1">ALEXANDRA</Item> 
           <StarRating>3</StarRating> 
           <HotelRooms> 
           <HotelRoom Code="SB" NumberOfRooms="1"/> 
           </HotelRooms> 
          </Hotel> 
          <Hotel HasExtraInfo="true" HasPictures="true"> 
           <City Code="LON">London</City> 
           <Item Code="ALO">Aloft London Excel</Item> 
           <StarRating>4</StarRating> 
           <HotelRooms> 
           <HotelRoom Code="SB" NumberOfRooms="1"/> 
           </HotelRooms> 
          </Hotel> 
          <Hotel HasExtraInfo="true" HasMap="true" HasPictures="true"> 
           <City Code="LON">London</City> 
           <Item Code="AMB3">Ambassadors Bloomsbury</Item> 
           <StarRating>4</StarRating> 
           <HotelRooms> 
           <HotelRoom Code="SB" NumberOfRooms="1"/> 
           </HotelRooms> 
          </Hotel> 
         </HotelDetails> 
        </SearchHotelPriceResponse> 
        </ResponseDetails> 
       </Response> 
      </format> 
      <args/> 
     </payloadFactory> 
     <property expression="$body" name="bodyBackup" type="OM"/> 
     <iterate expression="$body//Response/ResponseDetails/SearchHotelPriceResponse/HotelDetails/Hotel" 
        id="Hotels"> 
      <target> 
       <sequence> 
        <filter regex="true()" source="$body//Hotel/@HasExtraInfo"> 
        <then> 
         <enrich> 
          <source clone="true" type="inline"> 
           <ImageCode xmlns="">IMG10004</ImageCode> 
          </source> 
          <target action="child" xpath="$body//Hotel"/> 
         </enrich> 
        </then> 
        <else/> 
        </filter> 
        <loopback/> 
       </sequence> 
      </target> 
     </iterate> 
     </inSequence> 
     <outSequence> 
     <property name="HotelDetails" scope="default"> 
      <HotelDetails xmlns=""/> 
     </property> 
     <aggregate id="Hotels"> 
      <completeCondition> 
       <messageCount max="-1" min="-1"/> 
      </completeCondition> 
      <onComplete enclosingElementProperty="HotelDetails" expression="$body/*[1]"> 
       <enrich> 
        <source clone="true" xpath="$body/*[1]"/> 
        <target xpath="$ctx:bodyBackup//Response/ResponseDetails/SearchHotelPriceResponse/HotelDetails"/> 
       </enrich> 
       <enrich> 
        <source clone="true" xpath="$ctx:bodyBackup/*[1]"/> 
        <target type="body"/> 
       </enrich> 
       <send/> 
      </onComplete> 
     </aggregate> 
     </outSequence> 
    </target> 
    <description/> 
</proxy> 

对于该解决方案,这是结果

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soapenv:Body> 
     <Response ResponseReference="REF_D_028_749-2801486459143247"> 
     <ResponseDetails Language="en"> 
      <SearchHotelPriceResponse> 
       <HotelDetails> 
        <Hotel HasExtraInfo="false" HasMap="true" HasPictures="true"> 
        <City Code="LON">London</City> 
        <Item Code="ALE1">ALEXANDRA</Item> 
        <StarRating>3</StarRating> 
        <HotelRooms> 
         <HotelRoom Code="SB" NumberOfRooms="1"/> 
        </HotelRooms> 
        </Hotel> 
        <Hotel HasExtraInfo="true" HasPictures="true"> 
        <City Code="LON">London</City> 
        <Item Code="ALO">Aloft London Excel</Item> 
        <StarRating>4</StarRating> 
        <HotelRooms> 
         <HotelRoom Code="SB" NumberOfRooms="1"/> 
        </HotelRooms> 
        <ImageCode>IMG10004</ImageCode> 
        </Hotel> 
        <Hotel HasExtraInfo="true" HasMap="true" HasPictures="true"> 
        <City Code="LON">London</City> 
        <Item Code="AMB3">Ambassadors Bloomsbury</Item> 
        <StarRating>4</StarRating> 
        <HotelRooms> 
         <HotelRoom Code="SB" NumberOfRooms="1"/> 
        </HotelRooms> 
        <ImageCode>IMG10004</ImageCode> 
        </Hotel> 
       </HotelDetails> 
      </SearchHotelPriceResponse> 
     </ResponseDetails> 
     </Response> 
    </soapenv:Body> 
</soapenv:Envelope> 
+0

没错! Thanx Ernesto。 – namalfernandolk

使用“foreach”调解器迭代“酒店”节点,并在它的序列中,可以使用富媒体(将调整单个节点)

+0

确定。我也会试试这个让米歇尔。 Thanx – namalfernandolk