1

質問を言い換えると、私は WSO2 BPS サーバーを使用してビジネス プロセスを実行し、WSO2 ESB で RestProxy サービスを呼び出しています。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 コントロールで使用できるようにする方法です。たとえば、「If Value > 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 は私の得意分野ではなく、まだ理解しようとしています。

4

1 に答える 1

2

同様の問題に遭遇した人のために、私はこのクエリを次のように解決しました:

呼び出されたサービスの出力メッセージ変数からアトミック値を抽出するには、使用できます

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

この関数は、WS-BPEL-2.0 仕様では定義されていません。しかし、これは WSO2-BPS と Apache-ODE で機能します。XPath 式を使用して、変数から一連の要素を抽出するために使用できます。

例 -

<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 式です。

于 2012-12-03T19:13:36.497 に答える