Итерация ответа DSS в BPEL (WSO2 BPS)

Я использую WSO2 BPS and WSO2 DSS.
DSS имеет 2 services, как показано ниже:
(1) возвращает список состояний и
(2) вставляет запись в таблицу.

Мне удалось вызвать обе службы DSS из BPEL Workflow. Но мне нужно добиться следующего.
Мой 1-й DSS вернет "Список статусов". Я должен повторить (используя 'forEach' or 'while' или...) этот ответ и выбрать из него конкретный узел (StatusDescription) и использовать его для следующего вызова DSS. Мой первый ответ DSS ниже.

<Response xmlns="http://ws.wso2.org/dataservice">
    <Status>
        <StatusId>1</StatusId>
        <StatusDescription>Active</StatusDescription>
    </Status>
    <Status>
        <StatusId>2</StatusId>
        <StatusDescription>Inactive</StatusDescription>
    </Status>
</Response>  

Может ли кто-нибудь предложить какой-нибудь учебник или фрагмент кода, который будет повторять приведенный выше ответ DSS? т. е. My bpel:finalCounterValue будет «2», так как в приведенном выше XML есть 2 узла «Статус».

Заранее спасибо.


person Vijay Krish    schedule 19.04.2013    source источник
comment
Нет причин повторять действия с использованием BPEL. Просто используйте обычное выражение XPath в задании. Что-то вроде <from>$VariableName/*[child::StatusId = 2]/StatusDescription</from> (без пространств имен) должно помочь.   -  person joergl    schedule 19.04.2013
comment
Ты прав Йоргл. Но приведенный выше ответ является лишь образцом. На самом деле номер статуса может отличаться (динамический). Значит, надо искать другой вариант. Спасибо.   -  person Vijay Krish    schedule 22.04.2013


Ответы (1)


Я нашел способ перебирать узлы. Пожалуйста, найдите фрагмент кода ниже.

<bpel:forEach parallel="no" counterName="Counter" name="ForEach">
            <bpel:startCounterValue>
                <![CDATA[1]]>
            </bpel:startCounterValue>
            <bpel:finalCounterValue>                
                <![CDATA[count($GetStatusPLResponse.parameters/ns:Status)]]>
            </bpel:finalCounterValue>
            <bpel:scope>
                <!-- Some activity goes here. Say Assign or Invoke or .... -->
            </bpel:scope>
        </bpel:forEach>  

Метод count, доступный в пространстве имен xmlns:bpel="http://docs.oasis-open.org/wsbpel/2.0/process/executable", помогает нам найти количество узлов ('Status').
Метод count возвращает значение '2', поэтому 'forEach' выполняет итерацию дважды.

Счастливого обучения.

person Vijay Krish    schedule 22.04.2013