[xquery-talk] RE: aggregate , grouping

John Snelson jsnelson at sleepycat.com
Wed Dec 21 23:40:32 PST 2005


This query should do what you want:

declare function local:pathOfNode($node)
{
   if(empty($node/..)) then ""
   else concat(local:pathOfNode($node/..), "/", local-name($node))
};

let $paths := for $n in //* return local:pathOfNode($n)
for $p in distinct-values($paths)
return concat($p," count is ",count($paths[.=$p]))

As you can see the query is not exactly simple to write. It does make me 
wonder what it is that you are trying to acheive, and whether there 
would be a better way to do it.

John

David Carlisle wrote:
>   the oupt of the xquery i need is the following:-
>   trans/item count is 2
>   trans/item/elem/ count is 2
> 
> It's a lot easier to do this sort of thing in xslt, but in xquery I
> suppose you'd do something like
> 
> <x>
>  <trans id="1">
>    <item>
>          <elem><elem> it </elem></elem>
>    </item>
>   </trans>
>   <trans id="2">
>      <item>
>          <elem><elem> is </elem></elem>
>     </item>
>   </trans>
> </x>
> 
> 
> 
> 
> for $n in distinct-values(//*/name())
> return
> ("
> count",$n,count(//*[name()=$n]))
> 
> 
> $ saxon8q -s count.xml count.xq
> <?xml version="1.0" encoding="UTF-8"?>
> count x 1
> count trans 2
> count item 2
> count elem 4
> 
> David
> 
> ________________________________________________________________________
> This e-mail has been scanned for all viruses by Star. The
> service is powered by MessageLabs. For more information on a proactive
> anti-virus service working around the clock, around the globe, visit:
> http://www.star.net.uk
> ________________________________________________________________________
> _______________________________________________
> 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