[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