BPEL中的forEach循环(WSO2 BPS)

时间:2015-02-20 18:47:26

标签: wso2 bpel

我无法找出问题的根本原因,为什么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>

输入将包含多个ID,

    <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'timp'

1 个答案:

答案 0 :(得分:0)

这个问题可能与原版海报不再相关,但我希望包含一个答案,以防其他人遇到同样的问题。

如果要在$ Counter位置获取DCTID的DEFTYPE,请使用以下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()&lt; 3]为了从某一组中选择前两个节点。