[xquery-talk] Generating an element sequence matching a template
Howard Katz
howardk at fatdog.com
Wed Apr 26 06:14:46 PDT 2006
Ah, the man from my other list! :-)
Thank, John. I'll give that a try.
Howard
> -----Original Message-----
> From: John Snelson [mailto:jsnelson at sleepycat.com]
> Sent: April 26, 2006 3:26 AM
> To: Howard Katz
> Cc: 'Liam Quin'; talk at xquery.com
> Subject: Re: [xquery-talk] Generating an element sequence
> matching a template
>
> What about this:
>
> declare function local:fill-row-data($headers as xs:string*,
> $row-data
> as element()*) as element()* {
> if(empty($headers)) then () else
> if(exists($row-data) and local-name($row-data[1]) eq $headers[1])
> then (
> $row-data[1],
> local:fill-row-data(subsequence($headers, 2),
> subsequence($row-data, 2))
> )
> else (
> element {$headers[1]} {},
> local:fill-row-data(subsequence($headers, 2), $row-data)
> )
> };
>
> let $headers := ( "e_1", "e_2", "e_3", "e_1", "e_4" )
> let $row-data := ( <e_3>33</e_3>, <e_1>123</e_1>, <e_4>44</e_4> )
> return
> local:fill-row-data($headers, $row-data)
>
> I think that covers all of the bases.
>
> John
>
> Howard Katz wrote:
> > Here's the current syntax for your query, Liam:
> >
> > for $e in $headers (: or $template, as I was calling it
> earlier :-)
> > return
> > if ($row-data[local-name() = $e] )
> > then $row-data[local-name() = $e]
> > else element { $e }{ }
> >
> > This one produces two <e_1>123</e_1> nodes. I think Mike's
> got the right
> > idea of using position() and maybe count() to ensure that
> the correct data
> > node gets picked up in the proper order; I think I just
> need to play with it
> > some.
> >
> > Howard
> >
> > > -----Original Message-----
> > > From: talk-bounces at xquery.com
> > > [mailto:talk-bounces at xquery.com] On Behalf Of Liam Quin
> > > Sent: April 25, 2006 3:11 PM
> > > To: Howard Katz
> > > Cc: talk at xquery.com
> > > Subject: Re: [xquery-talk] Generating an element sequence
> > > matching a template
> > >
> > > On Tue, Apr 25, 2006 at 02:13:21PM -0700, Howard Katz wrote:
> > > > It actually gets a bit harder yet. If we now omit the
> > > first <e_1> in the
> > > > row-data:
> > > >
> > > > let $headers := ( "e_1", "e_2", "e_3", "e_1", "e_4" )
> > > > let $row-data := ( <e_3>33</e_3>, <e_1>123</e_1>,
> <e_4>44</e_4> )
> > > >
> > > > we end up with:
> > > >
> > > > <e_1>123</e_1>, <e_2/>, <e_3>33</e_3>, <e_1/>, <e_4>44</e_4>
> > > >
> > > > I'm not 100% sure about this, but I would think a more
> > > "correct" ordering
> > > > would be one that preserved the original order of
> > > $row-data as much as
> > > > possible, as in:
> > > >
> > > > <e_1/>, <e_2/>, <e_3>33</e_3>, <e_1>123</e_1>, <e_4>44</e4>
> > >
> > > I'd probably try to write very pedestrian, simple code first...
> > >
> > > for $e in $headers
> > > if ($row-data[local-name() = $e])
> > > then $row-data[local-name() = $e])
> > > else <element name="{$e}"></element>
> > >
> > > (I don't remember if we ended up allowing such dynamic
> constructors
> > > but I hope so!)
> > >
> > >
> > > Liam
> > >
> > > --
> > > Liam Quin, W3C XML Activity Lead, http://www.w3.org/People/Quin/
> > > http://www.holoweb.net/~liam/
> > > _______________________________________________
> > > talk at xquery.com
> > > http://xquery.com/mailman/listinfo/talk
> > >
> >
> > _______________________________________________
> > talk at xquery.com
> > http://xquery.com/mailman/listinfo/talk
>
>
> --
> John Snelson, Berkeley DB XML Engineer
> Sleepycat Software, Inc
> http://www.sleepycat.com
>
> Contracted to Sleepycat through Parthenon Computing Ltd
> http://blog.parthcomp.com/dbxml
>
More information about the talk
mailing list