2014-09-03 121 views
0

使用Xquery我想获取具有min sortOrder的行。在id = 3的行下面的示例中。获取具有min属性的元素

<table> 
    <row id="1"><attribute identifier="sortOrder">120</attribute><attribute identifier="mainContent">Test 3</attribute></row> 
    <row id="2"><attribute identifier="sortOrder">130</attribute><attribute identifier="mainContent">Test 1</attribute></row> 
    <row id="3"><attribute identifier="sortOrder">10</attribute><attribute identifier="mainContent">Test 2</attribute></row> 
</table> 

任何人都有提示?

回答

2

找到最小值与MIN()函数,然后看看它在行:

let $min := min(//row/attribute[@identifier='sortOrder']) 
return //row[attribute[@identifier='sortOrder'] = $min] 
+0

谢谢你的帮助的任何功能。我编辑了上面的代码,因为您可以看到在另一行中可以有多个具有相同内容的属性。我如何将属性标识符添加到返回部分? – frgtv10 2014-09-03 10:55:29

+0

更新了答案 – 2014-09-03 11:32:01

+0

也许你也有提示http://stackoverflow.com/questions/25643317/for-loop-with-min-value? – frgtv10 2014-09-03 11:40:38

2

如果你有机会到XQuery 3.0实现,那么我挺采取此功能的方法:

xquery version "3.0"; 

let $apply := function($xs, $f, $xpath) { 
    $xpath($xs[. = $f($xs)]) 
} return 


$apply(
    //row/attribute[@identifier eq 'sortOrder'], 
    fn:min#1, 
    function($x) { 
     $x/parent::node() 
    } 
) 

这种方法的一个漂亮的特性是只需要做的最初数据搜索一次,即//row/attribute[@identifier eq 'sortOrder']只需要进行一次评估,这可能是更有效的。

另外一个很好的特性是拉姆达$apply是一个通用的功能,所以你可以重新使用它,将在$xs操作例如fn:max#1 :-)