在 XQuery 中重复兄弟节点时对值求和

Sum the values when siblings nodes are repeated in XQuery

我有一系列嵌套节点,我试图在每个 loan 中找到 due_date 节点的重复日期(仅考虑年份和月份),然后对他们的兄弟节点(amount)。 一个例子解释得更好。

文件payments.xml:

<loan>
 <id>1</id>
 <payments>
    <local_payment>
        <due_date>2012-11-28T08:00:00Z</due_date>
        <amount>484</amount>
    </local_payment>
    <local_payment>
        <due_date>2012-12-05T08:00:00Z</due_date>
        <amount>450</amount>
    </local_payment>
    <local_payment>
        <due_date>2012-12-12T08:00:00Z</due_date>
        <amount>484</amount>
    </local_payment>
    <local_payment>
        <due_date>2012-01-19T08:00:00Z</due_date>
        <amount>450</amount>
    </local_payment>
    <local_payment>
        <due_date>2012-01-26T08:00:00Z</due_date>
        <amount>450</amount>
    </local_payment>
 </payments>
</loan>
<loan>
  <id>2</id>
  <payments>
    <local_payment>
        <due_date>2013-02-02T08:00:00Z</due_date>
        <amount>500</amount>
    </local_payment>
    <local_payment>
        <due_date>2013-02-09T08:00:00Z</due_date>
        <amount>500</amount>
    </local_payment>
    <local_payment>
        <due_date>2013-03-16T08:00:00Z</due_date>
        <amount>600</amount>
    </local_payment>
    <local_payment>
        <due_date>2013-04-23T08:00:00Z</due_date>
        <amount>650</amount>
    </local_payment>
  </payments>
</loan>

我已经写了一个简单的函数来提取年和月,但我不知道其余的怎么做。 预期输出应该没有每笔贷款的重复日期,并且它们的金额相加。

这是 group by 的 XQuery 3.0 构造的一个很好的示例,所以我假设您的 XQuery 处理器支持 3.0。

你可以根据这样的year/month条件进行分组(有内置函数可以获取dateTime的月份和年份,所以不需要自己写)。然后您可以使用 sum().

计算总和

但是,XQuery 是一种查询语言,并不旨在更新现有数据,因此您将不得不重建数据。由于您没有明确指定您希望如何获得结果输出结构,因此我采用了自己的方法 - 根据需要进行调整。

for $loan in /loan
return 
  <loan>
  { $loan/id }
  <payments>{
    for $payment in $loan/payments/local_payment
    let $year-month := month-from-dateTime($payment/due_date) || year-from-dateTime($payment/due_date)
    group by $year-month
    return <local_payment>
      { $payment/due_date }
      <amount>{ sum($payment/amount) }</amount>
    </local_payment>

  }</payments></loan>