Thank you. I'm not actually trying to use the process for anything meaningful. I was trying to illustrate the behavior I noticed when using query expressions within a forEach loop. It's entirely possible that there is something wrong with my process, but I do know that one snippet works and the other doesn't. I'll see if I can come up with a simpler example.
-Jon On 4/13/09 9:02 AM, "Ford, Mark" <[email protected]> wrote: > You're saying that there is a difference in behavior between an expression > to-spec and a query to-spec. The example you provided looks the same > semantically and only differs in syntax. My suggestion is to produce a simpler > test case that shows this behavior and submit it as a bug if it still fails. > > The use of the forEach below (and the expressionLanguage attributes and CDATA > nodes) is overly complicated. You may also be running into a subtle issue > (possibly still an open bug) with the use of the forEach counter variable > within a predicate. I believe you need to wrap the variable usage within a > number() function. > > I'm also assuming that the forEach below was only a portion of your actual > process and that you're doing something more than iterating over assigns with > a forEach. For example, you probably have an invoke somewhere in the real > code. While the snippet below is valid BPEL (at least at a quick glance) it's > not a good use case for the forEach. The code below would be better > accomplished in an Xquery FLWOR expression. Again - apologies if it's just to > illustrate the bug - just mentioning it in case it was the real thing. > > > > On 4/13/09 11:33 AM, "Jonathan Coogan" <[email protected]> wrote: > > I'm still stuck on this. Does anyone have any suggestions? Should I write > a bug report? > > Thank you. > -Jon > > > On 4/7/09 10:30 AM, "Jon Coogan" <[email protected]> wrote: > >> 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 >>> > > > > > >
