I want to use Group By in xquery. Can someone tell me please how to use Group By in Marklogic ?
4 Answers
Alternatively, you could call out to XSLT using xdmp:xslt-invoke
or xdmp:xslt-eval
. MarkLogic's XSLT processor supports XSLT 2.0, which includes full support for <xsl:for-each-group>
.
The short answer is to use map:map
. See http://docs.marklogic.com/map:map for documentation, and http://blakeley.com/blogofile/archives/560/ for a longer discussion.
xquery version "1.0-ml";
let $xml:= <Students>
<Student Country="England" Name="Dan" Age="20" Class="C"/>
<Student Country="England" Name="Maria" Age="20" Class="B" />
<Student Country="Australia" Name="Mark" Age="22" Class="A" />
</Students>
let $xsl:= <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fn="http://www.w3.org/2005/xpath-functions">
<xsl:template match="Students">
<result>
<xsl:for-each-group select="Student" group-by="@Country">
<country>
<xsl:attribute name="name"><xsl:value-of select="fn:current-grouping-key()"/></xsl:attribute>
<xsl:for-each select="fn:current-group()/@Name">
<name><xsl:value-of select="."/></name>
</xsl:for-each>
</country>
</xsl:for-each-group>
</result>
</xsl:template>
</xsl:stylesheet>
return xdmp:xslt-eval($xsl,$xml)
MarkLogic covers parts of XQuery 3.0 (with its 1.0-ml dialect), but unfortunately FLWOR group by support is lacking.
However, you can still programmatically create group by like syntax which will achieve the same results. Here is an XQuery example:
for $d in distinct-values(doc("order.xml")//item/@dept)
let $items := doc("order.xml")//item[@dept = $d]
order by $d
return <department code="{$d}">{
for $i in $items
order by $i/@num
return $i
}</department>
HTH
-
1
-
1You could speed up this approach using
cts:values
(instead of distinct-values), andcts:search
(instead of XPath predicates), particularly if you can store order items as separate files.– grtjnCommented Dec 15, 2016 at 8:11
group by
support was added to FLWOR expressions; before that point, you have to do it yourself). A summary ofgroup by
in XQuery 3.0 can be found at docs.basex.org/wiki/XQuery_3.0#Group_By