我想从列表中提取最常用的元素。
列表$listOut
由此类元素组成:
<Outcome>
<Parameter>B</Parameter>
<Value>15</Value>
<MinVal>1</MinVal>
<MaxVal>20</MaxVal>
</Outcome>
<Outcome>
<Parameter>A</Parameter>
<Value>15</Value>
<MinVal>1</MinVal>
<MaxVal>20</MaxVal>
</Outcome>
<Outcome>
<Parameter>D</Parameter>
<Value>43</Value>
<MinVal>34</MinVal>
<MaxVal>36</MaxVal>
</Outcome>
<Outcome>
<Parameter>B</Parameter>
<Value>4</Value>
<MinVal>1</MinVal>
<MaxVal>20</MaxVal>
</Outcome>
我想要获得的是<Parameter>B</Parameter>
,因为参数B存在2次,因此它是最常见的。
我不知道如何执行此操作我无法使用group by
语句。 (仅限For,Let,Order By,Where,Return)
我想过做这样的事情:
for $outOk in distinct-values( $listOut )
let $paramOk := //Outcome[Parameter eq $outOk]
order by count( //Outcome[Parameter eq $outOk] )
return $paramOk
但它自然不起作用。
答案 0 :(得分:5)
不同的值只能在atomar值上确定,而不能在整个子树上确定。相反,查询参数的不同值,然后计算与此参数匹配的元素,按参数出现次序排序,最后限制为单个结果。
let $listOut := (
<Outcome>
<Parameter>B</Parameter>
<Value>15</Value>
<MinVal>1</MinVal>
<MaxVal>20</MaxVal>
</Outcome>,
<Outcome>
<Parameter>A</Parameter>
<Value>15</Value>
<MinVal>1</MinVal>
<MaxVal>20</MaxVal>
</Outcome>,
<Outcome>
<Parameter>D</Parameter>
<Value>43</Value>
<MinVal>34</MinVal>
<MaxVal>36</MaxVal>
</Outcome>,
<Outcome>
<Parameter>B</Parameter>
<Value>4</Value>
<MinVal>1</MinVal>
<MaxVal>20</MaxVal>
</Outcome>
)
return
(
(: loop over the set of distinct parameter values :)
for $parameter in distinct-values( $listOut/Parameter )
(: for each of them, count its occurences :)
let $occurences := count($listOut[Parameter eq $parameter])
(: order the result set by the occurence count in descending order :)
order by $occurences descending
return $parameter
(: limit to the first result, which is the parameter value occuring most :)
)[1]