【问题标题】:forEach loop in BPEL (WSO2 BPS)BPEL 中的 forEach 循环 (WSO2 BPS)
【发布时间】:2015-02-20 18:47:25
【问题描述】:

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

【问题讨论】:

  • 现在我得到一个不同的错误
  • 现在我得到一个不同的错误分配错误:selectionFailure:R-Value 表达式“{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, fauType=null ({ $input.payload/tns:DCTResponse /tns:DCTIDs/tns:DCTID[$Counter]/tns:DEFTYPE}" 返回多个节点。)]

标签: wso2 bpel


【解决方案1】:

这个问题可能与原发帖者不再相关,但我想包括一个答案,以防其他人有同样的问题。

如果您想在 $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()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多