2017-05-15 5 views
1

Ich habe 3 XML-Strukturen wie unten:Wie füge ich die Werte für die jeweiligen Elemente hinzu?

a.xml 
<Books> 
    <Book> 
    <Publisher>ABC Pvt Ltd</Publisher> 
    <Month>May</Month> 
    <Year>2016</Year> 
    <BooksReleased>4</BooksReleased> 
    </Book> 
</Books> 

b.xml 
<Books> 
    <Book> 
    <Publisher>XYZ Pvt Ltd</Publisher> 
    <Month>April</Month> 
    <Year>2016</Year> 
    <BooksReleased>2</BooksReleased> 
    </Book> 
</Books> 

c.xml 
<Books> 
    <Book> 
    <Publisher>ABC Pvt Ltd</Publisher> 
    <Month>June</Month> 
    <Year>2016</Year> 
    <BooksReleased>2</BooksReleased> 
    </Book> 
</Books> 

Ich würde diese XML durch Verleger mögen Gruppe und müssen auch seine Gesamt nicht berechnen. von Büchern veröffentlicht vom Verlag für ein bestimmtes Jahr.

gewünschte Ausgabeformat:

<TotalCalc> 
    <PublishedBook> 
    <Publisher>ABC Pvt Ltd</Publisher> 
    <no.of books>6</no.of books>  
    </PublishedBook> 
    <PublishedBook> 
    <Publisher>XYZ Pvt Ltd</Publisher> 
    <no.of books>2</no.of books> 
    </PublishedBook> 
</TotalCalc> 

Bitte, hilf mir habe ich versucht, die folgenden aber es ist nicht

typeswitch($Publisher) 
case element (ABC Pvt Ltd) 
    return sum($doc/BooksReleases[$doc/$Publisher = 'ABC Pvt Ltd']) 
default return 'unknnown' 

Antwort

1

Arbeits Es könnte möglich sein cts:value-tuples zu verwenden Kookkurrenzen von Publisher zu ziehen und 'BooksReleased', die Sie dann nach Publisher iterieren können. Das würde viel besser skalieren. Etwas wie:

let $aggregates := map:map() 
let $_ := 
    for $tuple in cts:value-tuples((
    cts:element-reference(xs:QName("Publisher")), 
    cts:element-reference(xs:QName("BooksReleased")) 
)) 
    let $values := json:array-values($tuple) 
    let $pub := $values[1] 
    let $books as xs:int := $values[2] 
    return map:put($aggregates, $pub, (map:get($aggregates, $pub), 0)[1] + $books) 
return $aggregates 

Hinweis gedacht, dass dies erfordert Indizes auf Publisher und BooksReleased, und es ist wichtig, dass jedes Dokument enthält nur einen (Wert) Publisher Kreuzprodukte zu verhindern.

Ich würde auch einfach fallen (oder ignorieren) BooksReleased, und einfach sicherstellen, dass Sie jedes Buch als separates Dokument speichern. Sie können dann cts:values unter Publisher verwenden und cts:frequency für jeden Publisher-Wert verwenden, um die Anzahl der Bücher für die Publisher zu ermitteln.

HTH!

+0

Gibt es einen anderen möglichen Weg als Tupel? Da wir Tupel der Version 7 verwenden, können sie nicht verwendet werden – LSB

+0

Die Funktion 'cts: value-tuples' ist auch in MarkLogic 7 bekannt: http://docs.marklogic.com/7.0/cts:value-tuples. Falls Sie nur Tupel der Größe 2 benötigen, können Sie auch die älteren ['cts: element-value-co-occurrences'] verwenden (http://docs.marklogic.com/7.0/cts:element-value-co- Vorkommen) et al .. – grtjn

+0

was wird 'cts: value-tuples' zurückgeben? Und warum machen wir 'json: array-values' über jedes Element? – basari66

Verwandte Themen