2012-04-23 14 views
5

Quiero usar Group By en xquery. ¿Puede alguien decirme cómo utilizar Group By en Marklogic?Cómo usar Group By en Marklogic?

+1

no ha utilizado MarkLogic. Pero, por favor, eche un vistazo a http://blakeley.com/blogofile/archives/560/ –

+0

¿La versión de MarkLogic que está utilizando admite el borrador de XQuery 3.0? (Es solo a partir de 3.0 que se agregó soporte 'group by' a las expresiones FLWOR; antes de ese punto, debe hacerlo usted mismo). Puede encontrar un resumen de 'group by' en XQuery 3.0 en http://docs.basex.org/wiki/XQuery_3.0#Group_By –

Respuesta

4

Como alternativa, puede llamar a XSLT usando xdmp:xslt-invoke o xdmp:xslt-eval. El procesador XSLT de MarkLogic es compatible con XSLT 2.0, que incluye soporte completo para <xsl:for-each-group>.

+0

Consulte la respuesta de @mg_kedzie para obtener un ejemplo .. – grtjn

0

MarkLogic cubre partes de XQuery 3.0 (con su dialecto de 1.0 ml), pero desafortunadamente falta el grupo FLWOR por soporte.

Sin embargo, todavía puede crear programáticamente grupo por sintaxis similar que obtendrá los mismos resultados. Este es un ejemplo de 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 no es compatible agrupar por. – wst

+0

Puede acelerar este enfoque utilizando 'cts: values' (en lugar de valores distintos) y' cts: search' (en lugar de predicados XPath), especialmente si puede almacenar elementos de pedido como archivos separados. – grtjn

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)