2012-04-23 21 views
5

Tôi muốn sử dụng Group By in xquery. Ai đó có thể cho tôi biết làm thế nào để sử dụng Group By trong Marklogic?Cách sử dụng Group By in Marklogic?

+1

đã không được sử dụng MarkLogic. Nhưng vui lòng xem http://blakeley.com/blogofile/archives/560/ –

+0

Phiên bản MarkLogic bạn đang sử dụng có hỗ trợ bản nháp XQuery 3.0 không? (Nó chỉ bằng 3,0 mà 'nhóm by' hỗ trợ đã được thêm vào FLWOR biểu thức, trước thời điểm đó, bạn phải làm điều đó cho mình). Bạn có thể tìm thấy tóm tắt về 'nhóm by' trong XQuery 3.0 tại http://docs.basex.org/wiki/XQuery_3.0#Group_By –

Trả lời

4

Hoặc, bạn có thể gọi đến XSLT bằng cách sử dụng xdmp:xslt-invoke hoặc xdmp:xslt-eval. Bộ xử lý XSLT của MarkLogic hỗ trợ XSLT 2.0, bao gồm hỗ trợ đầy đủ cho <xsl:for-each-group>.

+0

Xem câu trả lời của @mg_kedzie để biết ví dụ .. – grtjn

0

MarkLogic bao gồm các phần của XQuery 3.0 (với phương ngữ 1,0 ml), nhưng tiếc là nhóm FLWOR thiếu hỗ trợ.

Tuy nhiên, bạn vẫn có thể tạo nhóm theo cách lập trình bằng cú pháp sẽ đạt được kết quả tương tự. Dưới đây là một ví dụ 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 không hỗ trợ nhóm theo. – wst

+0

Bạn có thể tăng tốc phương pháp này bằng cách sử dụng 'cts: values' (thay vì giá trị riêng biệt) và' cts: search' (thay vì các biến vị ngữ XPath), đặc biệt nếu bạn có thể lưu trữ các mục đơn hàng dưới dạng các tệp riêng biệt. – 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)