【问题标题】:How to add the values for respective elements?如何为各个元素添加值?
【发布时间】:2017-05-15 04:08:16
【问题描述】:

我有如下 3 个 XML 结构:

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>

我想按发布者对这些 XML 进行分组,还需要计算其总数。出版商在特定年份发行的图书数量。

所需的输出格式:

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

请帮帮我,我尝试了以下方法,但它不起作用

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

【问题讨论】:

    标签: xpath xquery marklogic marklogic-8


    【解决方案1】:

    也许可以使用cts:value-tuples 来提取Publisher 和“BooksReleased”的同时出现,然后您可以通过 Publisher 对其进行迭代聚合。那会更好地扩展。比如:

    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
    

    请注意,这需要在PublisherBooksReleased 上建立索引,并且每个文档只包含一个(值)Publisher 以防止交叉积,这一点很重要。

    我还会考虑简单地删除(或忽略)BooksReleased,并确保将每本书保存为单独的文档。然后,您可以在 Publisher 上使用 cts:values 并在每个出版商值上使用 cts:frequency 以获取出版商的图书数量。

    HTH!

    【讨论】:

    • 除了使用元组还有其他可能的方法吗?因为我们使用的是版本 7,所以不能使用元组
    • 函数 cts:value-tuples 在 MarkLogic 7 中也是已知的:docs.marklogic.com/7.0/cts:value-tuples。如果您只需要大小为 2 的元组,您也可以使用较旧的 cts:element-value-co-occurrences 等。
    • cts:value-tuples 会返回什么?以及为什么我们对每个项目都使用json:array-values
    • 点击我之前评论中的链接,或者我的答案顶部的链接。 cts:value-tuples 返回json:array*。 json:array 是一种确保顺序的 MarkLogic 类型。 XQuery 序列也可以这样做,但不能嵌套。 Json 数组可以。此外,json 数组可以具有任意长度,这很有用,因为 cts:value-tuples 允许提取 2 的共现组合,也可以提取 3、4 甚至更多的组合。另请参阅该函数的文档。
    猜你喜欢
    • 2012-11-25
    • 1970-01-01
    • 2021-09-15
    • 2019-08-19
    • 1970-01-01
    • 1970-01-01
    • 2015-01-26
    • 2018-07-26
    • 1970-01-01
    相关资源
    最近更新 更多