[xquery-talk] Generating an element sequence matching a template
Howard Katz
howardk at fatdog.com
Tue Apr 25 14:34:45 PDT 2006
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