Hello!
I also encountered this bug. This is very strange and unexpected bug.
After some debugging time I found a workaround, and I think this worth
reporting in JIRA. Here is piece of my process:
<?xml version="1.0" encoding="UTF-8"?>
<bpws:forEach counterName="signer" name="ForEachSignerUserName"
parallel="no">
<bpws:startCounterValue><![CDATA[1]]></bpws:startCounterValue>
<bpws:finalCounterValue><![CDATA[count($processingData/pdata:signer)]]></bpws:finalCounterValue>
<bpws:scope name="CheckSignerRolesScope">
<bpws:sequence name="CheckSignerRoles">
<bpws:assign name="prepareGetSignerDbId" validate="no">
<bpws:copy>
<!-- *this works fine!* -->
<bpws:from><![CDATA[$processingData/pdata:signer[$signer]/@name]]></bpws:from>
<bpws:to><![CDATA[$getUsers.parameters/ps:nameFilter]]></bpws:to>
</bpws:copy>
</bpws:assign>
<bpws:assign name="ExtractSignerInfo" validate="no">
<bpws:copy>
<bpws:from><![CDATA[$getUserMembershipsResponse.parameters]]></bpws:from>
<!-- *this don't work!* -->
<bpws:to><![CDATA[$processingData/pdata:signer[$signer]/pdata:memberships/*[1]]]></bpws:to>
</bpws:copy>
</bpws:assign>
</bpws:sequence>
</bpws:scope>
</bpws:forEach>
As I said after some tricks, I made it work without temporary variable
as Wenfeng mentioned.
<?xml version="1.0" encoding="UTF-8"?>
<bpws:forEach counterName="signer" name="ForEachSignerUserName"
parallel="no">
<bpws:startCounterValue><![CDATA[1]]></bpws:startCounterValue>
<bpws:finalCounterValue><![CDATA[count($processingData/pdata:signer)]]></bpws:finalCounterValue>
<bpws:scope name="CheckSignerRolesScope">
<bpws:sequence name="CheckSignerRoles">
<bpws:assign name="prepareGetSignerDbId" validate="no">
<bpws:copy>
<!-- *this works fine!* -->
<bpws:from><![CDATA[$processingData/pdata:signer[$signer]/@name]]></bpws:from>
<bpws:to><![CDATA[$getUsers.parameters/ps:nameFilter]]></bpws:to>
</bpws:copy>
</bpws:assign>
<bpws:assign name="ExtractSignerInfo" validate="no">
<bpws:copy>
<bpws:from><![CDATA[$getUserMembershipsResponse.parameters]]></bpws:from>
<!-- *this works also* -->
<bpws:to><![CDATA[$processingData/pdata:signer[number(string($signer))]/pdata:memberships/*[1]]]></bpws:to>
</bpws:copy>
</bpws:assign>
</bpws:sequence>
</bpws:scope>
</bpws:forEach>
Regards,
Alexey Ousov
Hi Alex,
Thanks. But I had checked the issues you mentioned. The problem must
be in elsewhere. Notice that when I simply replace $i with a normal unsignedInt
variable $_i1, turning the piece above into:
<forEach counterName="i" parallel="no">
<startCounterValue>1</startCounterValue>
<finalCounterValue>2</finalCounterValue>
<scope>
<assign>
<copy>
<from variable="i" />
<to variable="_i1"/>
</copy>
<copy>
<from>$i</from>
<to>$output0.body/xsd0:field1[position()=$_i1]</to> <!-- note this
line -->
</copy>
</assign>
</scope>
</forEach>
it works fine!
The attachements is the process files and you can try it. My environment is:
ODE 2.0 Build #87 (2009-1-8 2:25:04).
Thanks&Regards.
Wenfeng
======= 2009-01-21 23:36:47 您在来信中写道:=======
"No result for expression ... " does not mean "$i does not work in XPath
predicate expression".
http://ode.apache.org/faq.html
*Q.* *My process fails with a selectionFailure; What can I do?*
*A.* BPEL expects a *single* element to be selected when evaluating <to> and
<from> expressions, and a selectionFailure fault is thrown if zero or more
than one element are selected.
If you get zero element, double-check your namespace prefix and bindings.
Also, remember that you must initialize your variables (most often with
<literal>'s) before assigning into them, unless your are reassigning the
whole variable (e.g. directly into $variable, or $variable.part). To debug
assignments, you can set the "org.apache.ode" logging category to DEBUG in
order to see the content of variables as the process executes.
2009/1/21 ZHAO Wenfeng <[email protected]>
Hi all,
I found another BUG-like problem in ODE 2.0 Build #87 (2009-1-8 2:25:04).
That is: the counterName variable can't be used in the position expression
of XPath as normal variables are. For example, the following BPEL piece
<forEach counterName="i" parallel="no">
<startCounterValue>1</startCounterValue>
<finalCounterValue>2</finalCounterValue>
<scope>
<assign>
<copy>
<from>$i</from>
<to>$output0.body/xsd0:field1[position()=$i]</to>
<!-- note this line -->
</copy>
</assign>
</scope>
</forEach>
will incur such ERROR in ODE:
ERROR - GeronimoLog.error(104) | Assignment Fault: {
http://docs.oasis-open.org/wsbpel/2.0/process/executable}selectionFailure,lineNo=149,faultExplanation={http://docs.oasis-open.org/wsbpel/2.0/process/executable}selectionFailure<http://docs.oasis-open.org/wsbpel/2.0/process/executable%7DselectionFailure,lineNo=149,faultExplanation=%7Bhttp://docs.oasis-open.org/wsbpel/2.0/process/executable%7DselectionFailure>:
No results for expression: {OXPath10Expression
$output0.body/xsd0:field1[position()=$i]}
12:39:37,781 ERROR [ASSIGN] Assignment Fault: {
http://docs.oasis-open.org/wsbpel/2.0/process/executable}selectionFailure,lineNo=149,faultExplanation={http://docs.oasis-open.org/wsbpel/2.0/process/executable}selectionFailure<http://docs.oasis-open.org/wsbpel/2.0/process/executable%7DselectionFailure,lineNo=149,faultExplanation=%7Bhttp://docs.oasis-open.org/wsbpel/2.0/process/executable%7DselectionFailure>:
No results for expression: {OXPath10Expression
$output0.body/xsd0:field1[position()=$i]}
But when I simply replace $i with a normal unsignedInt variable $_i1,
turning the piece above into:
<forEach counterName="i" parallel="no">
<startCounterValue>1</startCounterValue>
<finalCounterValue>2</finalCounterValue>
<scope>
<assign>
<copy>
<from variable="i" />
<to variable="_i1"/>
</copy>
<copy>
<from>$i</from>
<to>$output0.body/xsd0:field1[position()=$_i1]</to>
<!-- note this line -->
</copy>
</assign>
</scope>
</forEach>
it works fine! How strange! The expression language and query language used
are both the default one, i.e. XPath 1.0.
Need I commit a bug report to the developers of ODE? :-)
Thanks & Regards.
Wenfeng
ZHAO Wenfeng
[email protected]
2009-01-21
= = = = = = = = = = = = = = = = = = = =
致
礼!
ZHAO Wenfeng
[email protected]
2009-01-22