[xquery-talk] Generating an element sequence matching a template
Michael Kay
mhk at mhk.me.uk
Tue Apr 25 22:49:35 PDT 2006
Yes, this makes the problem harder. Something like
for $t at $pos in $template
let $c := count($template[position() le $pos][. eq $t])
return element {$t} { string($row-data[local-name()=$t][$c]) }
Michael Kay
http://www.saxonica.com/
> -----Original Message-----
> From: Howard Katz [mailto:howardk at fatdog.com]
> Sent: 25 April 2006 21:35
> To: 'Michael Kay'; talk at xquery.com
> Subject: RE: [xquery-talk] Generating an element sequence
> matching a template
>
> That does indeed work with the given example, but it fails in
> a slightly more complex case, one that unfortunately I didn't
> think to provide. I showed an example with duplicate entries
> in the template; I should have shown one that also has
> duplicates in the *data*, a not uncommon occurrence.
>
> For example, this solution doesn't work if there are
> duplicate <e_1> nodes in the data:
>
> let $template := ( "e_1", "e_2", "e_3", "e_1", "e_4" ) let
> $row-data := ( <e_1>11</e_1>, <e_3>33</e_3>,
> <e_1>e_11-2</e_1>, <e_4>44</e_4> )
>
> Saxon reports "A sequence of more than one item is not
> allowed as the first argument of string()".
>
> Any thoughts?
>
> Howard
>
> > -----Original Message-----
> > From: talk-bounces at xquery.com
> > [mailto:talk-bounces at xquery.com] On Behalf Of Michael Kay
> > Sent: April 25, 2006 11:55 AM > To: 'Howard Katz';
> talk at xquery.com > Subject: RE: [xquery-talk] Generating an
> element sequence > matching a template > > Isn't it simply:
> >
> > for $t in $template return
> > element {$t} { string($row-data[local-name()=$t]) }
> >
> > Michael Kay
> > http://www.saxonica.com/
> >
> > > -----Original Message-----
> > > From: talk-bounces at xquery.com
> > > [mailto:talk-bounces at xquery.com] On Behalf Of Howard
> Katz > > Sent: 25 April 2006 19:39 > > To: talk at xquery.com
> > > Subject: [xquery-talk] Generating an element sequence >
> > matching a template > > > > > > Given a template of
> element names, I want to be able to write > > an XQuery
> function that takes that template, as well as a > > sequence
> of element nodes, and returns a "filled-out" list of > >
> elements where the template supplies the final length of the
> > > list and the names of empty elements to add to it if
> they're > > missing from the data. It's probably easier to
> provide an > > example than describe it.
> > >
> > > For example, given the data:
> > >
> > > let $template := ( "e_1", "e_2", "e_3", "e_1", "e_4" )
> let > > $row-data := ( <e_1/>11</e_1>, <e_3>33</e_3>,
> <e_4>44</e_4> ) > > > > I want the "fill-row-data(
> $template as xs:string+, $row-data > > as element()+ )"
> function to return this sequence:
> > >
> > > ( <e_1/>11</e_1>, <e_2/>, <e_3>33</e_3>, <e_1/>,
> <e_4>44</e_4> ) > > > > The initial $row-data will contain
> some or all of the > > elements named in the template, and
> in the same order where > > present. The number of nodes in
> the final result will be the > > same as the number of names
> in the template. Where the > > element sequence has nodes
> corresponding to the template, > > those nodes are left as
> is. Where nodes that are named in the > > template are
> missing from the actual data, empty filler nodes > > are
> generated (eg <e_2/> and <e_1/>.
> > >
> > > The problem is motivated by a desire to produce an xhtml
> > > table where the list of <th> headers is fixed, but the
> actual > > data rows are sparse and heterogenous. I want to
> be able to > > generate homogenous rows so that the contents
> of each row > > exactly matches the given header.
> > >
> > > Howard
> > >
> > > _______________________________________________
> > > talk at xquery.com
> > > http://xquery.com/mailman/listinfo/talk
> >
> > _______________________________________________
> > talk at xquery.com
> > http://xquery.com/mailman/listinfo/talk
> >
>
More information about the talk
mailing list