Как извлечь атомарное значение из переменной на основе сообщения и присвоить выходной переменной с помощью XPATH

Просто перефразируя вопрос, я использую сервер WSO2 BPS для запуска бизнес-процесса для вызова службы RestProxy на ESB WSO2. Я получаю ответ через выходную переменную с именем LVCounterOut. LVCounterOut — это переменная на основе типа сообщения, а ответ представлен в формате XML, как показано ниже:

<message>
 <payload>
  <Response>
     <Terminal>
       <Name>RValue</Name>
       <Value>0.000000</Value>
     </Terminal>
     <Terminal>
       <Name>SValue</Name>
       <Value>**1.000000**</Value>
     </Terminal>
  </Response>
 </payload>
</message>

Как я могу присвоить атомарное значение в указанной выше переменной выходной переменной бизнес-процесса. Например, в приведенном выше ответе я хотел бы присвоить числовую часть узла «Значение», которая равна «1.0000000», которая будет в строковом формате для выходной переменной процесса. Следующий вопрос будет заключаться в том, как преобразовать это строковое значение в целое число, чтобы я мог использовать его в элементе управления If в моем бизнес-процессе. например, «Если значение > 10», вызовите ServiceA, иначе вызовите ServiceB».

Вот что я уже пытался сделать, чтобы назначить вывод из переменной LVCounterOut выходной переменной «ProcessOutput».

<bpel:assign validate="no" name="AssignProxyOut">
        <bpel:copy>
            <bpel:from>
                <bpel:literal>
                    <tns:LVCounterProcessResponse xmlns:tns="http://wso2.org/bps/sample" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><tns:return>tns:return</tns:return>

                    </tns:LVCounterProcessResponse>
                </bpel:literal>
            </bpel:from>
            <bpel:to variable="ProcessOutput" part="payload"></bpel:to>
        </bpel:copy>
        <bpel:copy>
            <bpel:from>
              <![CDATA[$LVCounterOut.payload/ns:Response/ns:Terminal[2]/ns:Value/text()]]>
            </bpel:from>
            <bpel:to part="payload" variable="ProcessOutput">
                <bpel:query queryLanguage="urn:oasis:names:tc:wsbpel:2.0:sublang:xpath1.0"><![CDATA[tns:return]]></bpel:query>
            </bpel:to>
        </bpel:copy>
    </bpel:assign>

Когда я запускаю бизнес-процесс на сервере BPS с помощью tryit, я получаю следующую ошибку

[2012-11-20 16:41:59,882] ERROR - BpelEngineImpl - Scheduled job failed; jobDetail=JobDetails( instanceId: null mexId: hqejbhcnphr7rsjnbxjhrs processId:
 {http://wso2.org/bps/sample}LVSelectProcess-127 type: INVOKE_INTERNAL channel: null correlatorId: null correlationKeySet: null retryCount: null inMem:
false detailsExt: {enqueue=false}) java.lang.ClassCastException: java.lang.String cannot be cast to org.w3c.dom.Node at
org.jaxen.dom.DocumentNavigator.getChildAxisIterator(DocumentNavigator.java:152)
at org.jaxen.util.DescendantAxisIterator.next(DescendantAxisIterator.java:129)

Я предполагаю, что использование XPATH здесь неправильно, или я иду совершенно не так? Я приношу извинения, но XML и XPATH не являются моей сильной стороной, и я все еще пытаюсь разобраться с этим.


person uraza2001    schedule 20.11.2012    source источник
comment
Почему меня проголосовали за то, что я задал вопрос? Я застрял в проблеме и пытаюсь получить ответ здесь, может ли кто-нибудь указать мне причину, по которой меня проголосовали? Также был бы полезен ответ   -  person uraza2001    schedule 21.11.2012


Ответы (1)


Для тех, кто сталкивается с подобной проблемой, я решил этот запрос следующим образом:

Чтобы извлечь атомарные значения из переменной выходного сообщения вызванной службы, вы можете использовать

Функция bpel:getVaribleData(varName, partName, xpathStr).

Эта функция не определена в спецификации WS-BPEL-2.0. Но это работает в WSO2-BPS и Apache-ODE. Его можно использовать для извлечения набора элементов из переменной с помощью выражения XPath.

eg -

<bpel:copy>
<bpel:from>
    <![CDATA[count(bpel:getVariableData(‘$Variable','$partName')/ns:return)]]>
</bpel:from>
<bpel:to variable="itemCount"></bpel:to>
</bpel:copy>

Не забудьте использовать ‘’ при передаче varName и partName. А здесь «/ns:return» — это выражение xpath.

person uraza2001    schedule 03.12.2012