2010-07-20 44 views
0

我有以下XML,其中我需要做到以下几点:XML比较和排序查询

如果两个标题和文本元素的值是相同的,排序的列表元素基于分数属性

例如: 这里第一个和第三个列表元素的标题和文本的值是相同的,所以这两个应该根据分数排序并显示分数最高的列表并丢弃其他列表。

我该如何做到这一点?

所需的输出:

<list> 
    <title>abcd</title> 
    <text>abcd</text> 
    <score>2</score> 
</list> 

----- ----- XML

<result> 
<list> 
    <title>abcd</title> 
    <text>abcd</text> 
    <score>1</score> 
</list> 
<list> 
    <title>efgh</title> 
    <text>efgh</text> 
    <score>3</score> 
</list> 
<list> 
    <title>abcd</title> 
    <text>abcd</text> 
    <score>2</score> 
</list> 
<result> 

回答

0

假设我理解正确的话,那你想只返回列表中的节点,其中标题和文本是相同的,并且每个值的分数都是最高的。而且,由于您标记了“xquery”这个问题,我假设您想在xquery中执行此操作。

declare function local:getHighScores($result as node()) as node()* { 

    let $same := 
    for $i in $result/list 
    where ($i/title/text() = $i/text/text()) 
    return $i 

    let $unique_titles := fn:distinct-values($same/title/text()) 

    return 
    for $title in $unique_titles 
    return 
     (
     for $j in $result/list 
     where $j/title = $title 
     order by $j/score descending 
     return $j 
    )[1] 

}; 

let $xml := <result> 
<list> 
    <title>abcd</title> 
    <text>abcd</text> 
    <score>1</score> 
</list> 
<list> 
    <title>efgh</title> 
    <text>efgh</text> 
    <score>3</score> 
</list> 
<list> 
    <title>abcd</title> 
    <text>abcd</text> 
    <score>2</score> 
</list> 
<list> 
    <title>abcdg</title> 
    <text>abcde</text> 
    <score>2</score> 
</list> 
</result> 


return local:getHighScores($xml) 
0

如果你想订购的得分list的,而不是仅仅返回高分(如mbrevoort的答案),你可以做到以下几点:

注:我添加了一个额外的list到XML来显示一个列表,其中titletext不匹配。

输入XML(在XQuery input.xml中):

<?xml version="1.0" encoding="UTF-8"?> 
<result> 
    <list> 
     <title>abcd</title> 
     <text>abcd</text> 
     <score>1</score> 
    </list> 
    <list> 
     <title>abcd</title> 
     <text>efgh</text> 
     <score>6</score> 
    </list> 
    <list> 
     <title>efgh</title> 
     <text>efgh</text> 
     <score>3</score> 
    </list> 
    <list> 
     <title>abcd</title> 
     <text>abcd</text> 
     <score>2</score> 
    </list> 
</result> 

的XQuery:

<result> 
{ 
for $list in doc("file:///C:/xquery_test/input.xml")/result/list[title = text] 
order by $list/title, $list/score 
return 
    $list 
}  
</result> 

生成的XML:

<?xml version="1.0" encoding="UTF-8"?> 
<result> 
    <list> 
     <title>abcd</title> 
     <text>abcd</text> 
     <score>1</score> 
    </list> 
    <list> 
     <title>abcd</title> 
     <text>abcd</text> 
     <score>2</score> 
    </list> 
    <list> 
     <title>efgh</title> 
     <text>efgh</text> 
     <score>3</score> 
    </list> 
</result> 

(这是使用Saxon-HE XQuery 9运行的。)