[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