2012-04-23 49 views
5

我想在xquery中使用Group By。请问有人能告诉我如何在Marklogic中使用Group By?如何在Marklogic中使用Group By?

+1

没有使用Marklogic。但请查看http://blakeley.com/blogofile/archives/560/ – 2012-04-23 07:29:55

+0

您使用的MarkLogic版本是否支持XQuery 3.0草案? (FLWOR表达式中增加了“group by”支持,只有3.0版;在此之前,您必须自己完成)。 XQuery 3.0中“group by”的摘要可以在http://docs.basex.org/wiki/XQuery_3.0#Group_By找到 – 2012-04-23 15:14:15

回答

4

或者,你可以调用出来使用xdmp:xslt-invokexdmp:xslt-eval到XSLT。 MarkLogic的XSLT处理器支持XSLT 2.0,其中包括对<xsl:for-each-group>的全面支持。

+0

查看@mg_kedzie的答案举例.. – grtjn 2016-12-15 07:59:03

0

MarkLogic覆盖(与它的1.0-ml的方言)的XQuery 3.0的部分,但不幸的是FLWOR组由支撑不足。

但是,你仍然可以以编程方式创建由像语法组将达到同样的效果。下面是一个XQuery例如:

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

MarkLogic 5不支持通过...分组。 – wst 2013-05-23 22:04:30

+0

您可以使用'cts:values'(而不是distinct-values)和'cts:search'(而不是XPath谓词)加速此方法,特别是如果您可以将订单项存储为单独的文件。 – grtjn 2016-12-15 08:11:39

1
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)