首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从基于消息的变量中提取原子值,并使用XPATH将其赋值给输出变量

如何从基于消息的变量中提取原子值,并使用XPATH将其赋值给输出变量
EN

Stack Overflow用户
提问于 2012-11-21 01:19:19
回答 1查看 881关注 0票数 1

换句话说,我正在使用WSO2 BPS服务器运行一个业务流程来调用WSO2企业服务总线上的RestProxy服务。我通过一个名为LVCounterOut的输出变量得到一个响应。LVCounterOut是基于消息类型的变量,响应为XML格式,如下所示:

代码语言:javascript
复制
<message>
 <payload>
  <Response>
     <Terminal>
       <Name>RValue</Name>
       <Value>0.000000</Value>
     </Terminal>
     <Terminal>
       <Name>SValue</Name>
       <Value>**1.000000**</Value>
     </Terminal>
  </Response>
 </payload>
</message>

我是否可以将上述变量中的原子值赋给业务流程的输出变量。例如,在上面的响应中,我想将"Value“节点的数字部分"1.0000000”以字符串格式分配给进程的输出变量。下一个问题是如何将此字符串值转换为整数,以便我可以在业务流程的If控件中使用它。例如"If Value > 10“调用ServiceA,否则调用ServiceB。

下面是我已经尝试将LVCounterOut变量的输出赋给输出变量"ProcessOutput“的方法。

代码语言:javascript
复制
<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>

当我使用tryit在BPS服务器上运行业务流程时,我得到以下错误

代码语言:javascript
复制
[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不是我的强项,我仍在努力掌握它。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-12-04 03:13:36

对于遇到类似问题的任何人,我已经按如下方式解决了这个问题:

要从被调用服务的输出消息变量中提取原子值,可以使用

bpel:getVaribleData(varName,partName,xpathStr)函数。

此函数未在WS-BPEL-2.0规范中定义。但这在WSO2-BPS和Apache-ODE中有效。它可用于通过XPath表达式从变量中提取一组元素。

例如-

代码语言:javascript
复制
<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表达式。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13478550

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档