[xquery-talk] Generating an element sequence matching a template
John Snelson
jsnelson at sleepycat.com
Wed Apr 26 12:25:30 PDT 2006
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