2015-02-20 1 views
1

Я не в состоянии выяснить причину для проблемы, почему цикл Foreach не работает,петля Foreach в BPEL (WSO2 БТС)

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

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

<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/нс: DCTResponse/нс: DCTIDs/нс: DCTID [раунд ($ marketCounter)]/нс: DEFTYPE' против '

+0

Теперь я получаю другую ошибку – user3061250

+0

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

ответ

0

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

Если вы хотите получить 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], чтобы выбрать первые два узла из определенного набора.
Смежные вопросы