Here is a similar scenario that doesn't work in either 1.2 or 1.X. In
this example I iterate over record set and copy each record to an
intermediate temp variable. Then I assign from the temp variable to the
output variable. The process should return the value from the last
record.
The problem occurs when copying from the dataset to the temporary
variable. If I use a query on the "to" side it won't work. Expressions
do work. (Look for inline comments below.)
<bpws:forEach counterName="Counter" name="ForEach" parallel="no">
<bpws:startCounterValue
expressionLanguage="urn:oasis:names:tc:wsbpel:2.0:sublang:xpath2.0"><![C
DATA[1]]></bpws:startCounterValue>
<bpws:finalCounterValue
expressionLanguage="urn:oasis:names:tc:wsbpel:2.0:sublang:xpath2.0"><![C
DATA[count($Data/ns0:Record)]]></bpws:finalCounterValue>
<bpws:scope>
<bpws:sequence name="Sequence">
<bpws:assign name="AssignToTempVariable" validate="no">
<bpws:copy>
<bpws:from>
<!-- Initialize temp variable. -->
<bpws:literal>
<tns:Record xmlns:tns="recordsnamespace"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="recordsnamespace records.xsd ">
<tns:SomeValue/>
<tns:AnotherValue/>
</tns:Record>
</bpws:literal>
</bpws:from>
<bpws:to variable="TempRecord"/>
</bpws:copy>
<!-- ********** This does not work. ********** -->
<bpws:copy>
<bpws:from variable="Data">
<bpws:query
queryLanguage="urn:oasis:names:tc:wsbpel:2.0:sublang:xpath2.0"><![CDATA[
ns0:Record[$Counter]/ns0:SomeValue]]></bpws:query>
</bpws:from>
<bpws:to variable="TempRecord">
<bpws:query
queryLanguage="urn:oasis:names:tc:wsbpel:2.0:sublang:xpath2.0"><![CDATA[
ns0:SomeValue]]></bpws:query>
</bpws:to>
</bpws:copy>
<bpws:copy>
<bpws:from variable="Data">
<bpws:query
queryLanguage="urn:oasis:names:tc:wsbpel:2.0:sublang:xpath2.0"><![CDATA[
ns0:Record[$Counter]/ns0:AnotherValue]]></bpws:query>
</bpws:from>
<bpws:to variable="TempRecord">
<bpws:query
queryLanguage="urn:oasis:names:tc:wsbpel:2.0:sublang:xpath2.0"><![CDATA[
ns0:AnotherValue]]></bpws:query>
</bpws:to>
</bpws:copy>
<!-- ********** This does work. ********** -->
<bpws:copy>
<bpws:from variable="Data">
<bpws:query
queryLanguage="urn:oasis:names:tc:wsbpel:2.0:sublang:xpath2.0"><![CDATA[
ns0:Record[$Counter]/ns0:SomeValue]]></bpws:query>
</bpws:from>
<bpws:to
expressionLanguage="urn:oasis:names:tc:wsbpel:2.0:sublang:xpath2.0"><![C
DATA[$TempRecord/ns0:SomeValue]]></bpws:to>
</bpws:copy>
<bpws:copy>
<bpws:from variable="Data">
<bpws:query
queryLanguage="urn:oasis:names:tc:wsbpel:2.0:sublang:xpath2.0"><![CDATA[
ns0:Record[$Counter]/ns0:AnotherValue]]></bpws:query>
</bpws:from>
<bpws:to
expressionLanguage="urn:oasis:names:tc:wsbpel:2.0:sublang:xpath2.0"><![C
DATA[$TempRecord/ns0:AnotherValue]]></bpws:to>
</bpws:copy>
</bpws:assign>
<bpws:assign name="AssignToOutput" validate="no">
<bpws:copy>
<bpws:from variable="TempRecord">
<bpws:query
queryLanguage="urn:oasis:names:tc:wsbpel:2.0:sublang:xpath2.0"><![CDATA[
ns0:AnotherValue]]></bpws:query>
</bpws:from>
<bpws:to part="payload" variable="output"/>
</bpws:copy>
</bpws:assign>
</bpws:sequence>
</bpws:scope>
</bpws:forEach>
-----Original Message-----
From: Jonathan Coogan [mailto:[email protected]]
Sent: Tuesday, April 07, 2009 9:56 AM
To: [email protected]; [email protected]
Subject: RE: Problem with query expressions
Hello. I have confirmed that using a relative query fixes the problem
in my Ode 1.X build, but this still does not work for me in Ode 1.2.
After switching to a relative query I am no longer getting a selection
failure, but the process is returning erroneous output. It returns the
entire dataset instead of just the element I was trying to query.
<bpws:forEach counterName="Counter" name="ForEach" parallel="no">
<bpws:startCounterValue
expressionLanguage="urn:oasis:names:tc:wsbpel:2.0:sublang:xpath2.0"><![C
DATA[1]]></bpws:startCounterValue>
<bpws:finalCounterValue
expressionLanguage="urn:oasis:names:tc:wsbpel:2.0:sublang:xpath2.0"><![C
DATA[count($Data/ns0:Record)]]></bpws:finalCounterValue>
<bpws:scope>
<bpws:assign validate="no">
<!-- This does not work in Ode 1.2 but it does work in Ode 1.X -->
<bpws:copy>
<bpws:from variable="Data">
<bpws:query
queryLanguage="urn:oasis:names:tc:wsbpel:2.0:sublang:xpath2.0"><![CDATA[
ns0:Record[$Counter]/ns0:AnotherValue]]></bpws:query>
</bpws:from>
<bpws:to part="payload" variable="output"/>
</bpws:copy>
<!-- This works.. -->
<bpws:copy>
<bpws:from
expressionLanguage="urn:oasis:names:tc:wsbpel:2.0:sublang:xpath2.0"><![C
DATA[$Data/ns0:Record[$Counter]/ns0:AnotherValue]]></bpws:from>
<bpws:to part="payload" variable="output"/>
</bpws:copy>
</bpws:assign>
</bpws:scope>
</bpws:forEach>
Is there something else I could be missing?
Thanks.
-Jon
-----Original Message-----
From: Matthieu Riou [mailto:[email protected]]
Sent: Friday, April 03, 2009 8:07 AM
To: [email protected]
Subject: Re: Problem with query expressions
On Thu, Apr 2, 2009 at 2:46 PM, Jonathan Coogan <
[email protected]> wrote:
> Hi. I'm having a problem when copying data from one variable to
> another within a forEach loop. When I use a query to copy data out of
> a variable I get a selection failure fault at runtime. This works
> correctly when I copy from an expression instead of a query.
>
> I have attached an example that demonstrates the problem. The
> expected output of the attached BPEL process is the string "five". It
> works correctly when using an expression, but fails when using a
> query. Here is the relevant snippet:
>
BPEL assignment doesn't provide any context node to the XPath engine,
everything is always relative to a variable. Which means that your query
should be relative and not absolute.
Matthieu
>
> <bpws:forEach counterName="Counter" name="ForEach" parallel="no">
> <bpws:startCounterValue
>
expressionLanguage="urn:oasis:names:tc:wsbpel:2.0:sublang:xpath2.0"><![C
DATA[1]]></bpws:startCounterValue>
> <bpws:finalCounterValue
>
expressionLanguage="urn:oasis:names:tc:wsbpel:2.0:sublang:xpath2.0"><![C
DATA[count($Data/ns0:Record)]]></bpws:finalCounterValue>
> <bpws:scope>
> <bpws:assign validate="no">
> <bpws:copy>
> <!--
> ----------------------------------------------------------------------
> ------
> -->
> <!-- This generates a selection failure at runtime. -->
> <bpws:from variable="Data">
> <bpws:query
>
queryLanguage="urn:oasis:names:tc:wsbpel:2.0:sublang:xpath2.0"><![CDATA[
/ns0:Record[$Counter]/ns0:SomeValue]]></bpws:query>
> </bpws:from>
>
> <!-- This works. -->
> <!-- <bpws:from
> expressionLanguage="urn:oasis:names:tc:wsbpel:2.0:sublang:xpath2.0"><!
> [CDATA[$Data/ns0:Record[$Counter]/ns0:SomeValue]]></bpws:from>
> -->
> <!--
> ----------------------------------------------------------------------
> ------
> -->
>
> <bpws:to part="payload" variable="output"/>
> </bpws:copy>
> </bpws:assign>
> </bpws:scope>
> </bpws:forEach>
>
> I have tested this with Ode 1.2 and a recent build of Ode 1.X and both
> behave the same. Can someone tell me if I am doing something wrong?
> Or should I write a bug report for this?
>
> Thanks for your time.
> -Jon
>