2012-03-29 65 views
1

我在Netbeans 6.8中構建BPEL流程,並調用返回int值列表的Web Service。如何遍歷BPEL流程中的整數列表

<xs:complexType name="getHotelsResponse"> 
<xs:sequence> 
<xs:element name="return" type="xs:int" minOccurs="0" maxOccurs="unbounded"></xs:element> 
</xs:sequence> 
</xs:complexType> 

我想(如果可能的話 - 不知道了...)通過所有這些整數迭代並調用他們的每一個不同的Web服務。

我嘗試使用ForEach活動,但我無法弄清楚我的情況。 它需要一個開始值和一個結束值(如果我能以某種方式獲得我返回的多少個整數),但即使如此,如果說我把一個Assign活動放在ForEach活動中,我如何獲得每個循環中列表的當前元素?

回答

7

我使用以下BPEL片段將列表的內容連接到逗號分隔的字符串中。 您可以在調用時使用相同的代碼來調用外部服務。

<bpel:forEach parallel="no" counterName="Counter" name="ForEach"> 
     <bpel:startCounterValue> 
      <![CDATA[1]]> 
     </bpel:startCounterValue> 
     <bpel:finalCounterValue><![CDATA[count($input.payload/tns:return)]]></bpel:finalCounterValue> 
     <bpel:scope> 
      <bpel:assign validate="no" name="AppendItem"> 
       <bpel:copy> 
        <bpel:from> 

         <![CDATA[concat($Response, $input.payload/tns:return[round($Counter)], ", ")]]> 
        </bpel:from> 
        <bpel:to variable="Response"></bpel:to> 
       </bpel:copy> 
      </bpel:assign> 
     </bpel:scope> 
    </bpel:forEach> 

您可以從以下XPath獲取元素的個數

count($input.payload/tns:return) 

你可以第i個元素使用以下XPath

$input.payload/tns:return[round($Counter)] 

你可以擺脫訪問值round()函數,但我不得不用它來擺脫Apache ODE中的一個問題。

+0

對於Waruna的優秀回答只是一個小的補充:如果您想在每次迭代中調用不同的Web服務端點,則需要在重複的範圍內聲明partnerlink,並使用partnerlink to-spec在其中指定目標EPR分配活動。 – vanto 2012-03-30 22:21:38

+0

哇...這真的是在bpel中迭代列表的唯一方法嗎?多麼原始的語言。 – wvdz 2015-04-13 13:29:01