我有以下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>
答案 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
,以显示列表中title
和text
不匹配的列表。
输入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运行的。)