[xquery-talk] Generating an element sequence matching a template

Howard Katz howardk at fatdog.com
Tue Apr 25 16:20:56 PDT 2006


If you're saying I need a better definition of the problem, I agree. Let me
mull and see if I can come up with a more precise formulation. 
Howard

 > -----Original Message-----
 > From: talk-bounces at xquery.com 
 > [mailto:talk-bounces at xquery.com] On Behalf Of Michael Kay
 > Sent: April 25, 2006 3:02 PM
 > To: 'Howard Katz'; talk at xquery.com
 > Subject: RE: [xquery-talk] Generating an element sequence 
 > matching a template
 > 
 > I think you're looking for (1) a definition of the problem, (2) an
 > algorithm, and only then (3) an expression of that algorithm 
 > in XQuery...
 > 
 > Michael Kay
 > http://www.saxonica.com/
 > 
 > 
 > > -----Original Message-----
 > > From: Howard Katz [mailto:howardk at fatdog.com] 
 > > Sent: 25 April 2006 22:13
 > > To: 'Michael Kay'; talk at xquery.com
 > > Subject: RE: [xquery-talk] Generating an element sequence 
 > > matching a template
 > > 
 > > 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>
 > > 
 > > However, if it's not possible to produce a solution that 
 > > preserves the ordering in this fashion, I'll need to mull 
 > > whether I can live with that.
 > > Since I don't have a better solution on hand, that might well 
 > > have to be ok.
 > > 
 > > Howard
 > > 
 > >  > -----Original Message-----
 > >  > From: Michael Kay [mailto:mhk at mhk.me.uk]  > Sent: April 
 > > 25, 2006 1:50 PM  > To: 'Howard Katz'; talk at xquery.com  > 
 > > Subject: RE: [xquery-talk] Generating an element sequence  > 
 > > matching a template  >  > 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
 > >  > >  >
 > >  > >
 > >  > 
 > > 
 > 
 > _______________________________________________
 > talk at xquery.com
 > http://xquery.com/mailman/listinfo/talk
 > 



More information about the talk mailing list