[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