цикл forEach в BPEL (WSO2 BPS)

Я не могу понять основную причину проблемы, почему цикл forEach не работает,

<bpel:forEach name="eachMarket" parallel="no" counterName="marketCounter">
                            <bpel:startCounterValue>1</bpel:startCounterValue>
                            <bpel:finalCounterValue>count($input.payload/tns:DCTResponse/tns:DCTIDs/tns:DCTID)</bpel:finalCounterValue>
                            <bpel:scope>
                                <bpel:assign>
                                    <bpel:copy ignoreMissingFromData="yes" insertMissingToData="yes">
                                        <bpel:from>$input.payload/tns:DCTResponse/tns:DCTIDs/tns:DCTID[round($marketCounter)]/tns:DEFTYPE</bpel:from>
                                        <bpel:to>$OrderParameterPLRequest.parameters/ns:DCTResponse/ns:DCTIDs/ns:DCTID[round($marketCounter)]/ns:DEFTYPE</bpel:to>
                                    </bpel:copy>
                                    <bpel:copy ignoreMissingFromData="yes" insertMissingToData="yes">
                                        <bpel:from>$input.payload/tns:DCTResponse/tns:DCTIDs/tns:DCTID[round($marketCounter)]/tns:MarketName</bpel:from>
                                        <bpel:to>$OrderParameterPLRequest.parameters/ns:DCTResponse/ns:DCTIDs/ns:DCTID[round($marketCounter)]/ns:MarketName</bpel:to>
                                    </bpel:copy>
                                    <bpel:copy ignoreMissingFromData="yes" insertMissingToData="yes">
                                        <bpel:from>$input.payload/tns:DCTResponse/tns:DCTIDs/tns:DCTID[round($marketCounter)]/tns:DCTID</bpel:from>
                                        <bpel:to>$OrderParameterPLRequest.parameters/ns:DCTResponse/ns:DCTIDs/ns:DCTID[round($marketCounter)]/ns:DCTID</bpel:to>
                                    </bpel:copy>
                                </bpel:assign>
                            </bpel:scope>
                        </bpel:forEach>
                        <bpel:forEach name="eachParameter" parallel="no" counterName="parameterCounter">
                            <bpel:startCounterValue>1</bpel:startCounterValue>
                            <bpel:finalCounterValue>count($input.payload/tns:DCTResponse/tns:AdditionalParamters/tns:Parameter)</bpel:finalCounterValue>
                            <bpel:scope name="parameterScope">
                                <bpel:assign>
                                    <bpel:copy ignoreMissingFromData="yes" insertMissingToData="yes">
                                        <bpel:from>$input.payload/tns:DCTResponse/tns:AdditionalParamters/tns:Parameter[$parameterCounter]/tns:Name</bpel:from>
                                        <bpel:to>$OrderParameterPLRequest.parameters/ns:DCTResponse/ns:AdditionalParamters/ns:Parameter[$parameterCounter]/ns:Name</bpel:to>
                                    </bpel:copy>
                                    <bpel:copy ignoreMissingFromData="yes" insertMissingToData="yes">
                                        <bpel:from>$input.payload/tns:DCTResponse/tns:AdditionalParamters/tns:Parameter[$parameterCounter]/tns:Value</bpel:from>
                                        <bpel:to>$OrderParameterPLRequest.parameters/ns:DCTResponse/ns:AdditionalParamters/ns:Parameter[$parameterCounter]/ns:Value</bpel:to>
                                    </bpel:copy>
                                </bpel:assign>
                            </bpel:scope>
                        </bpel:forEach>

Вход будет содержать несколько идентификаторов,

    <p:DCTIDs>
        <p:DCTID>
            <p:DEFTYPE>acvinclis</p:DEFTYPE>
            <p:MarketName>pectoreflammas</p:MarketName>
            <p:DCTID>3</p:DCTID>
        </p:DCTID>
        <p:DCTID>
            <p:DEFTYPE>acvinclis</p:DEFTYPE>
            <p:MarketName>pectoreflammas</p:MarketName>
            <p:DCTID>3</p:DCTID>
        </p:DCTID>
        <p:DCTID>
            <p:DEFTYPE>acvinclis</p:DEFTYPE>
            <p:MarketName>pectoreflammas</p:MarketName>
            <p:DCTID>3</p:DCTID>
        </p:DCTID>
    </p:DCTIDs>

Сообщение об ошибке: faultExplanation={http://docs.oasis-open.org/wsbpel/2.0/process/executable}selectionFailure: Нет результатов для выражения: '$OrderParameterPLRequest.parameters/ns:DCTResponse/ns:DCTIDs/ns:DCTID[round($marketCounter)]/ns:DEFTYPE' против '


person user3061250    schedule 20.02.2015    source источник
comment
Теперь я получаю другую ошибку   -  person user3061250    schedule 23.02.2015
comment
Теперь я получаю другую ошибку Ошибка назначения: selectionFailure: выражение R-значения {OXPath10Expression $input.payload/tns:DCTResponse/tns:DCTIDs/tns:DCTID[$Counter]/tns:DEFTYPE} вернулоmultiple.bpel.runtime. ASSIGN}/bps/ProcessOrder}ReportProcessWorkFlow-55 завершен с ошибкой: FaultData: [faultName={docs.oasis-open.org/wsbpel/2.0/process/executable}selectionFailure, faulType=null ({ $input.payload/tns:DCTResponse/tns:DCTIDs/tns:DCTID[$Counter] /tns:DEFTYPE} вернул несколько узлов.)]   -  person user3061250    schedule 23.02.2015


Ответы (1)


Этот вопрос, вероятно, больше не актуален для оригинального плаката, но я хотел включить ответ на случай, если у кого-то еще возникнет такая же проблема.

Если вы хотите получить DEFTYPE DCTID в позиции $Counter, используйте следующий XPath:

($input.payload/tns:DCTResponse/tns:DCTIDs/tns:DCTID)[position() = $Counter]/tns:DEFTYPE

Здесь важны две вещи:

  • Заключите в скобки все выражение до DTCID. По этой причине см. https://stackoverflow.com/a/8336922/5986352.
  • В то время как [1], [2] и т. д. будут работать, [$Counter] не будет работать. Вместо этого используйте [position() = $Counter]. Вы также можете использовать position() для выполнения некоторых более сложных запросов, например, [position() ‹ 3] для выбора первых двух узлов из определенного набора.
person curledUpSheep    schedule 18.05.2016