我有一系列嵌套节点,我试图找到每个due_date
中loan
个节点的重复日期(仅考虑年份和月份),然后求和他们的兄弟节点(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>
我已经编写了一个简单的函数来仅提取年份和月份,但我不知道其余的如何。 预期产出应该没有每笔贷款的重复日期,并且它们的金额相加。
答案 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>