[xquery-talk] momentary recursion dyslexia

Howard Katz howardk at fatdog.com
Sun Nov 27 12:30:56 PST 2005


Peter Coppens has provided a solution.  I'm assuming he doesn't mind if I
post this below.

I'd already figured out nearly identical solutions using a longer XQuery to
do the traversals, but it's nice to be reminded that a terse XPath can work
just as well as a lengthier FLWOR. This:

    concat( $p, '/'[ $p ], ... )

is particularly sweet.

Interestingly enough, this query works fine in Saxon but throws a type error
("Type of value does not match sequence type") in Galax and a "NOTANODE"
error in Mark Logic. Boiled down, what these processors appear to be
complaining about is this:

    <a/>/fn:name(.)

Can someone tell me why this is problematic for these two engines?
Howard 

 > -----Original Message-----
 > From: Peter Coppens [mailto:Peter.Coppens at datadirect.com] 
 > Sent: November 27, 2005 12:43 AM
 > To: Howard Katz
 > Subject: RE: [xquery-talk] momentary recursion dyslexia
 > 
 > Here is a quick attempt. Not entirely what you want but 
 > perhaps it helps
 > 
 > declare function local:f1($p,$i) {
 >   concat($p,'/'[$p],fn:name($i)),
 >   $i/*/local:f1(concat($p,'/'[$p],fn:name($i)),.)  
 > };
 > 
 > declare function local:f2($p,$i) {
 >   $i/*/local:f2(concat($p,'/'[$p],fn:name($i)),.),
 >   concat($p,'/'[$p],fn:name($i))
 > };
 > 
 > let $book := 
 >   <book>
 >     <author><name><last/><first/></name></author>
 >     <author><name><last/><first/></name></author>/
 >   </book>
 > return (
 >   <f1>{local:f1("",$book)}</f1>,
 >   <f2>{local:f2("",$book)}</f2>
 > )	
 > 
 > Hth,
 > 
 > Peter
 > 
 > > -----Original Message-----
 > > From: talk-bounces at xquery.com [mailto:talk-bounces at xquery.com] On
 > Behalf
 > > Of Howard Katz
 > > Sent: Friday, November 25, 2005 11:40 PM
 > > To: talk at xquery.com
 > > Subject: [xquery-talk] momentary recursion dyslexia
 > > 
 > > This seems like it should be a fairly straightforward CS101-style
 > problem ,
 > > but I can't seem to get it quite right. What I want is a recursive
 > > function
 > > that traverse an xml tree and builds xpaths. Given this variable
 > > assignment:
 > > 
 > >    let $book :=
 > >       <book>
 > >           <author><name><last/><first/></name></author>
 > >           <author><name><last/><first/></name></author>/
 > >       </book>
 > > 
 > > I'd like to have the function walk the $book tree, printing as it
 > goes:
 > > 
 > > book
 > > book/author
 > > book/author/name
 > > book/author/name/last
 > > book/author/name/first
 > > book/author
 > > book/author/name
 > > book/author/name/last
 > > book/author/name/first
 > > 
 > > To make things even more interesting, I'd also like (possibly via a
 > > different function, or the same one parameterized), to be able to
 > print
 > > out
 > > the xpaths from the leaves up, as in:
 > > 
 > > book/author/name/last
 > > book/author/name/first
 > > book/author/name
 > > book/author
 > > book
 > > book/author/name/last
 > > book/author/name/first
 > > book/author/name
 > > book/author
 > > book
 > > 
 > > I'm not sure if this reverse walker should be listing the root node
 > twice
 > > or
 > > not, but that's possibly a separate issue.
 > > 
 > > At any rate I'm having a momentary bout of recursion dyslexia. Can
 > anyone
 > > help?
 > > 
 > > TIA,
 > > Howard
 > > 
 > > _______________________________________________
 > > talk at xquery.com
 > > http://xquery.com/mailman/listinfo/talk
 > 
 > 



More information about the talk mailing list