我想在xquery中使用Group By。有人能告诉我如何在Marklogic中使用Group By吗?
答案 0 :(得分:4)
简短的回答是使用map:map
。有关文档,请参阅http://docs.marklogic.com/map:map;有关详细讨论,请参见http://blakeley.com/blogofile/archives/560/。
答案 1 :(得分:4)
或者,您可以使用xdmp:xslt-invoke
或xdmp:xslt-eval
呼叫XSLT。 MarkLogic的XSLT处理器支持XSLT 2.0,其中包括对<xsl:for-each-group>
的全面支持。
答案 2 :(得分: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)
答案 3 :(得分:0)
MarkLogic涵盖了XQuery 3.0的部分内容(使用1.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