2015-06-18 51 views
0

我有一個嵌套節點序列,我試圖找到每個loandue_date節點的重複日期(僅考慮年份和月份),然後將他們的兄弟節點(amount)。 一個例子更好地解釋。在XQuery中重複同胞節點時的值

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

我剛剛回答了您的問題,但您的問題實際上可能需要改進。對於XML/Xquery問題,發佈期望的輸出總是有用的,因爲目前還不清楚你到底想要什麼(什麼是「沒有重複日期」的意思,在我的答案中,我仍然輸出重複的日期......)。另外,如果你已經寫了一些東西,請將它包含到你的問題中,即使它失敗了 - 它只是爲了顯示你的努力。最後但並非最不重要的:歡迎來到SO! – dirkk

+0

非常感謝@dirkk的快速回復。對不起,下次我會按照你的提示提出我的問題。 –

回答

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

這是我需要的。這些數據將存儲在輸出文件中,然後我將使用它們與其他數據進行比較。 謝謝,現在我通過聲明瞭解羣組,並且只有截然不同的日期,我將使用distinct-values函數。 –

+0

我的功能只檢索年月是這樣的: '聲明函數的局部:年 - 月($以次爲節點()*)爲XS:字符串{ \t \t爲$我在$序列 \t \t回子( $ I,1,7) };' 我用這種方式顯示唯一的日期: '...... return {distinct-values($ payment/local:year -month(due_date))} {sum($ payment/amount)} ' 這是正確還是有其他方法?謝謝 –

+0

**總是**使用內置函數而不是自己編寫。正如我所說的,從XQuery中的dateTime獲取月份和年份的內置函數,所以不要使用某些子字符串,而只是使用它(查看'2012-12-31T17:00:00-07:00 ')。特別是對於日期這是相關的,因爲日期計算非常困難。例如,有效日期時間「2012-12-31T17:00:00-07:00」和「2013-01-01T00:00:00Z」實際上是相同的,但使用您的函數的年和月會有所不同。 – dirkk