[xquery-talk] sorting not working

Michael Kay mhk at mhk.me.uk
Fri Nov 18 15:39:38 PST 2005


As someone else spotted and I didn't, $copies//printdate is not going to
select anything when $copies is an attribute node.

Michael Kay
http://www.saxonica.com/ 

> -----Original Message-----
> From: talk-bounces at xquery.com 
> [mailto:talk-bounces at xquery.com] On Behalf Of Cindy Girard
> Sent: 18 November 2005 15:26
> To: talk at xquery.com
> Subject: Re[2]: [xquery-talk] sorting not working
> 
> OK - a little more info:
> We're using eXist.
> 
> 
> The three document segments:
> 
> nnr.b.xml
>             <compdate value="1788.B">c. 1788</compdate>
>             <printdate value="1794.A">c. 1794</printdate>
> 
> nnr.l.xml
>             <compdate value="1788.B">c. 1788</compdate>
>             <printdate value="1795">c. 1795</printdate>
> 
> nnr.g.xml
> 
>             <compdate value="1788.B">c. 1788</compdate>
>             <printdate value="1794.C">c. 1794</printdate>
> 
> The order it comes out as is:
> nnr.g, nnr.b, nnr.l
> 
> and it should be:
> nnr.b, nnr.g, nnr.l
> 
> (Is the '.A' '.C' throwing it off? We use the same ordering in another
> place and it works fine.)
> 
> I've changed the code to this:
> 
>          order by ($copies//compdate)[1]/@value, 
> ($copies//printdate)[1]/@value
> 
> with no change.
> 
> original code:
> 
>  {for $copies in 
> collection($g:collection)/bad[starts-with(@id, $workid)]/@id
>  let $bad :=collection($g:collection)/bad[@id = $copies]
>  let $copyversion := string($bad/@copy),
>        $comporder :=$bad[@id = $copies]//compdate[1]/@value,
>        $printorder :=$bad[@id = $copies]//printdate[1]/@value,
>        $printdate := $bad[@id = $copies]//printdate/text(),
>        $repository := $bad//repository/institution/text(),
>        $repcount := count($repository)
>           order by $copies//compdate[1]/@value, 
> $copies//printdate[1]/@value
>  return
>  if ($copies != $copyid)
>  then
>  <option value="{$copies}"><striptags>{if(exists($copyversion))then
>  <wrap>{$copyversion}, </wrap>else ""} {string($printdate)}
>  ({if($repcount = 1) then $repository else <wrap>Multiple
>  ({$repcount}) Institutions</wrap> })</striptags></option>
>  else ""
>  }
> 
> 
>  Thanks,
>  Cindy
> 
> MK> It would help to (a) provide a sample source document, 
> and (b) to say what
> MK> product you are using.
> 
> MK> Also "not working" is very unspecific: what output/error 
> do you get?
> 
> MK> The only thing I can see that's questionable is the 
> repeated use of
> 
> MK> x//compdate[1]
> 
> MK> This selects every compdate descendant that is the first 
> compdate child of
> MK> its parent. I suspect you intended to select the first 
> descendant compdate
> MK> element, which can be written
> 
> MK> (x//compdate)[1]
> 
> MK> or
> 
> MK> x/descendant::compdate[1]
> 
> MK> Michael Kay
> MK> http://www.saxonica.com/
> 
> 
> 
> 
> 
> >> -----Original Message-----
> >> From: talk-bounces at xquery.com 
> >> [mailto:talk-bounces at xquery.com] On Behalf Of Cindy Girard
> >> Sent: 17 November 2005 20:46
> >> To: talk at xquery.com
> >> Subject: [xquery-talk] sorting not working
> >> 
> >> Hi.
> >> 
> >> Is there another way I can word this? I'm just not sure where the
> >> error is.
> >> 
> >> Thanks,
> >> Cindy
> >> 
> >> -------------------------------------
> >> 
> >> {for $copies in collection($g:collection)/bad[starts-with(@id 
> >> , $workid)]/@id
> >> let $bad :=collection($g:collection)/bad[@id = $copies]
> >> let $copyversion := string($bad/@copy),
> >>       $comporder :=$bad[@id = $copies]//compdate[1]/@value,
> >>       $printorder :=$bad[@id = $copies]//printdate[1]/@value,
> >>       $printdate := $bad[@id = $copies]//printdate/text(),
> >>       $repository := $bad//repository/institution/text(),
> >>       $repcount := count($repository)
> >>          order by $copies//compdate[1]/@value, 
> >> $copies//printdate[1]/@value
> >> return 
> >> if ($copies != $copyid)
> >> then
> >> <option 
> >> value="{$copies}"><striptags>{if(exists($copyversion))then 
> >> <wrap>{$copyversion}, </wrap>else ""} {string($printdate)} 
> >> ({if($repcount = 1) then $repository else <wrap>Multiple 
> >> ({$repcount}) Institutions</wrap> })</striptags></option>
> >> else "" 
> >> 
> >> }
> >> 
> >> 
> >> 
> >> _______________________________________________
> >> talk at xquery.com
> >> http://xquery.com/mailman/listinfo/talk
> >> 
> 
> 
> MK> _______________________________________________
> MK> talk at xquery.com
> MK> http://xquery.com/mailman/listinfo/talk
> 
> 
> 
> -- 
> - Cindy 
> 
> _______________________________________________
> talk at xquery.com
> http://xquery.com/mailman/listinfo/talk
> 




More information about the talk mailing list