我很难根据需要应用的一些合并规则对一组XML进行排序。我是在XQuery 1.0中这样做的,并且一直在使用不同的值函数,但是我发现很难把我所需要的所有记录联系起来。
我试图应用的逻辑是
任何帮助都会很感激的。
<transaction_history>
<contribution_transaction contribution_type="Type A" currency="GBP">
<date>2015-12-31</date>
<payer>Employer</payer>
<amount>5042.38</amount>
<frequency>Quarterly</frequency>
</contribution_transaction>
<contribution_transaction contribution_type="Type A" currency="GBP">
<date>2015-12-31</date>
<payer>Employer</payer>
<amount>4676.94</amount>
<frequency>Monthly</frequency>
</contribution_transaction>
<contribution_transaction contribution_type="Type B" currency="GBP">
<date>2015-09-08</date>
<payer>Employer</payer>
<amount>4317.52</amount>
<frequency>Monthly</frequency>
</contribution_transaction>
<contribution_transaction contribution_type="Type A" currency="GBP">
<date>2015-12-31</date>
<payer>Employer</payer>
<amount>9393.11</amount>
<frequency>Quarterly</frequency>
</contribution_transaction>
<contribution_transaction contribution_type="Type A" currency="GBP">
<date>2015-10-02</date>
<payer>Employee</payer>
<amount>3944.49</amount>
<frequency>Monthly</frequency>
</contribution_transaction>
<contribution_transaction contribution_type="Type B" currency="GBP">
<date>2015-12-31</date>
<payer>Employee</payer>
<amount>3675.85</amount>
<frequency>Monthly</frequency>
</contribution_transaction>
<contribution_transaction contribution_type="Type B" currency="GBP">
<date>2015-10-02</date>
<payer>Employee</payer>
<amount>3385.69</amount>
<frequency>Monthly</frequency>
</contribution_transaction>
<contribution_transaction contribution_type="Type A" currency="GBP">
<date>2015-12-31</date>
<payer>Employee</payer>
<amount>7369.64</amount>
<frequency>Monthly</frequency>
</contribution_transaction>
</transaction_history>在…的例子中
<contribution_transaction contribution_type="Type A" currency="GBP">
<date>2015-12-31</date>
<payer>Employer</payer>
<amount>5042.38</amount>
<frequency>Quarterly</frequency>
</contribution_transaction>
<contribution_transaction contribution_type="Type A" currency="GBP">
<date>2015-12-31</date>
<payer>Employer</payer>
<amount>5042.38</amount>
<frequency>Quarterly</frequency>
</contribution_transaction>将导致:
<contribution_transaction contribution_type="Type A" currency="GBP">
<date>2015-12-31</date>
<payer>Employer</payer>
<amount>10084.76</amount>
<frequency>Quarterly</frequency>
</contribution_transaction>发布于 2016-04-14 12:05:10
您可以一个接一个地进行两个嵌套分组:
for $frequency in distinct-values(//frequency)
let $contrib := //contribution_transaction[frequency = $frequency]
for $payer in distinct-values($contrib/payer)
let $res := $contrib[payer = $payer]
let $min-date := min($res/date/xs:date(.))
return <result frequency="{$frequency}" payer="{$payer}">{
(: do something clever with the relevant transactions here :)
$res[xs:date(date) = $min-date]
}</result>由于您的日期格式与字典排序顺序是正确排序的,所以您也可以直接比较字符串:
for $frequency in distinct-values(//frequency)
let $contrib := //contribution_transaction[frequency = $frequency]
for $payer in distinct-values($contrib/payer)
let $res := $contrib[payer = $payer]
let $min-date := min($res/date/string())
return <result frequency="{$frequency}" payer="{$payer}">{
(: do something clever with the relevant transactions here :)
$res[date = $min-date]
}</result>由于您的处理器似乎只支持node()的参数作为fn:min(...)的参数,所以可以使用以下快速替换:
declare function local:min($seq) {
local:min((), $seq)
};
declare function local:min($min, $seq) {
if(empty($seq)) then $min
else (
let $first := $seq[1], $rest := $seq[position() > 1]
return (
if($min < $first) then local:min($min, $rest)
else local:min($first, $rest)
)
)
};
(: example usage :)
local:min(('B', 'A', 'b'))https://stackoverflow.com/questions/36621454
复制相似问题