[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