2013-05-29 30 views
5

Trong dịch vụ WSO2 ESB Proxy, làm thế nào tôi có thể lặp dựa trên giá trị số nguyên từ một số phản ứng webservice, giống như "foreach":WSO2 ESB chức năng foreach

Ví dụ nhắn phản ứng như vậy:

<Response> 
    <noOfcustomers>10</noOfCustomers> 
</Response> 

tôi cần phải lặp lại 10 lần (dựa trên số lượng khách hàng)

Điều này có khả thi không? Làm thế nào tôi có thể đạt được điều này?

Cảm ơn sự giúp đỡ của bạn!

Trả lời

0

Bạn có thể iterate dựa trên xpath. Nhưng hiện tại chúng tôi không có hỗ trợ truy cập. Usecase thực sự của bạn là gì?

+0

Cảm ơn phản hồi của bạn. Tôi cần gửi yêu cầu tín dụng với số phí được xác định (ví dụ 10 tháng), sau đó nếu yêu cầu tín dụng được chấp thuận cho dịch vụ web bên ngoài, tôi cần gửi 10 tin nhắn để tạo mỗi thông tin về phí: ngày thanh toán, thanh toán tối thiểu, thanh toán ngày hết hạn, vv – user2400243

+0

Ratha bất kỳ ý tưởng? – user2400243

+0

Bạn cần sử dụng trình trung gian sao chép? http://docs.wso2.org/wiki/display/ESB451/Clone+Mediator – Ratha

2

Tôi đã không tìm thấy một cách rõ ràng để làm điều này, nhưng đây là một giải pháp lộn xộn.

Trước tiên, bạn cần chuyển đổi XSLT.

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" exclude-result-prefixes="xsl xsi"> 
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
    <xsl:param name="iterations"/> 
    <xsl:template name="for.loop"> 
     <xsl:param name="i"/> 
     <xsl:param name="count"/> 
     <!--begin_: Line_by_Line_Output --> 
     <xsl:if test="$i &lt;= $count"> 
      <iteration> 
       <xsl:value-of select="$i"/> 
      </iteration> 
     </xsl:if> 
     <!--begin_: RepeatTheLoopUntilFinished--> 
     <xsl:if test="$i &lt;= $count"> 
      <xsl:call-template name="for.loop"> 
       <xsl:with-param name="i"> 
        <xsl:value-of select="$i + 1"/> 
       </xsl:with-param> 
       <xsl:with-param name="count"> 
        <xsl:value-of select="$count"/> 
       </xsl:with-param> 
      </xsl:call-template> 
     </xsl:if> 
    </xsl:template> 
    <xsl:template match="/"> 
     <iterations> 
      <xsl:call-template name="for.loop"> 
       <xsl:with-param name="i">1</xsl:with-param> 
       <xsl:with-param name="count"><xsl:value-of select="$iterations"/></xsl:with-param> 
      </xsl:call-template> 
     </iterations> 
    </xsl:template> 
</xsl:stylesheet> 

Sau đó, bạn sử dụng việc chuyển đổi theo thứ tự của bạn như thế này:

<inSequence> 
    <xslt key="conf:/repository/test/iterations.xslt"> 
     <property name="iterations" expression="//noOfcustomers"/> 
    </xslt> 
    <iterate expression="//iterations/iteration" sequential="true"> 
     <target> 
      <sequence> 

      </sequence> 
     </target> 
    </iterate> 
</inSequence> 

Trình tự trong hòa giải lặp sẽ chạy cho mỗi phần tử trong "lặp đi lặp lại". Hạn chế của phương pháp này là bạn đang thay thế nội dung thông báo bằng XML lặp, vì vậy bạn phải sử dụng trình làm phong phú trước khi chuyển đổi để lưu thư gốc vào thuộc tính nếu bạn muốn sử dụng lại nó.

+0

Cảm ơn Chris !! hãy để tôi thử giải pháp này! – user2400243

+0

Đây thực sự là cách rất thông minh để thực hiện việc này. – zygimantus

0

Điều này được hỗ trợ với trình trung gian ForEach từ ESB 4.9 trở đi

+0

Tôi nghi ngờ điều đó. ForEach cũng cần một biểu thức xpath để hoạt động. – zygimantus

+0

Có, không có cách nào để lặp qua bộ đếm trong tải trọng. Tuy nhiên, có FOREACH_COUNTER sẽ giúp theo dõi số lần lặp lại đang diễn ra. – maheeka

Các vấn đề liên quan