2017-02-27 17 views
0

私はEnrich Mediatorを使用してXMLを拡張しています。エンリッチメディエーターは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

答えて

5

使用「反復」のメディエータを使用することができます。私の解決策をチェックしてください。このソリューションの

<?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

1

使用「foreachの」仲介者は「ホテル」のノードを反復処理するために、それが順序だの内側に、あなたはproccessの集約ですべての要素を豊かメディエーター(つまり、単一のノードを変更します)

+0

OKです。私はこれもジャンミッシェルにしよう。 Thanx – namalfernandolk

関連する問題