在XQuery

时间:2015-06-18 12:32:20

标签: xquery

我有一系列嵌套节点,我试图找到每个due_dateloan个节点的重复日期(仅考虑年份和月份),然后求和他们的兄弟节点(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>

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

1 个答案:

答案 0 :(得分:0)

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

您可以根据这样的年/月条件进行分组(内置函数可以获取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>