XML比较和排序查询

时间:2010-07-20 10:34:11

标签: xquery

我有以下xml,我需要在其中执行以下操作:

如果title和text元素的值相同,则根据score属性

对这些list元素进行排序

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

我怎样才能做到这一点?

期望的输出:

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

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

如果您想按分数订购list而不是仅仅返回高分(如mbrevoort的答案),您可以执行以下操作:

注意:我在XML中添加了额外的list,以显示列表中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运行的。)