|
[XQuery Talk Mailing List Archive Home] [By Date] [By Thread] [By Subject] [By Author] [Recent Entries] [Reply To This Message] problem with loopsTitash Neogi titash_neogi at symantec.comWed Jan 4 02:12:47 PST 2006
Thanks for the replies. Here is a simplified outline of what I am trying to do I have a xml file as shown below <maps> <map> <pre> DATA0 </pre> <res> DATA1 </res> </map> <map> <pre> DATA1 </pre> <res> DATA2 </res> </map> <map> <pre> DATA2 </pre> <res> DATA3 </res> </map> <map> <pre> DATA3 </pre> <res> DATA4 </res> </map> . . . </maps> Now the idea is that if I search for DATA4, the system will trace its path backwards and find out all the linked dependencies. So the output would something like Query - DATA4 Result - DATA4 DATA3 DATA2 DATA1 DATA0 The algorithm I am trying to implement is 1. Obtain input from user 2. repeat steps 3 through 5 for the entire file 3. send user input to function A that identifies the <map> </map> chunk corresponding to this input 4. send the output of function A (step 3) to a function B that extracts the pre/text() bit of this chunk 5. send the output of function B (step 4) to function A (step 3 again) to identify the <map> </map> chunk Now, to repeat, my problem is that my function overwrites the values in the loop so that I only get the last variable's output. Hope this makes the logic a little clearer. Any further help on this would be really nice. Thanks Titash -----Original Message----- From: Michael Kay [mailto:http://xquery.com/mailman/listinfo/talk] Sent: Wednesday, January 04, 2006 3:19 PM To: Titash Neogi; http://xquery.com/mailman/listinfo/talk Subject: RE: problem with loops > Something as shown below > ____________________________________ > > > declare function lcl:caller() > { > let $QV1 := request:request-parameter("val1","") > let $count:= 0 > let $QV1:= lcl:tracer($QV1) > for $d in /maps/map > let $k:= lcl:rend($QV1) > let $QV2:= $QV1 > let $QV1:= lcl:tracer($k) > return $QV2 > }; > ________________________________________ > I don't know what your various functions here are doing, but the general approach to this kind of problem in a functional language is to use recursion. Your loop here is a bit odd because it doesn't depend on $d, so you seem to be using /maps/map merely to determine how many iterations there should be. This suggests a recursive solution along these lines: declare function f:doit ( $QV1 as item()* $count as xs:integer ) as item()* { if ($count eq 0) then $QV1 else f:doit(lcl:tracer(lcl:rend($QV1), $count - 1)) } I don't think that's precisely the logic, but it's difficult to reverse engineer your algorithm from incorrect code. Michael Kay http://www.saxonica.com/
|
PURCHASE STYLUS STUDIO ONLINE TODAY!Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced! Download The World's Best XML IDE!Accelerate XML development with our award-winning XML IDE - Download a free trial today! Subscribe in XML format
|






