如何计算每个元素在特定属性中的字数?
示例:我想计算每个国家有多少个城市,城市是这样的属性:world / country / [@ cities]。然后,我想将其显示为一个新列表,其中显示了每个国家/地区以及每个国家/地区拥有的城市数。
我已经尝试过了:
for $country in doc("world.xml")/world/country
let $neighbors := tokenize($country/@cities, '\s+')
let $count := count($neighbors)
order by $count
return ($country/name, $count)
但是我如何获得最大数量?
答案 0 :(得分:0)
一种可能采取的方法。根据逻辑结论开始,您已经按$count
对项目进行了排序,因此可以将这些已排序的项目绑定到变量,并使用fn:last()
函数检索最大的项目。您没有提供源数据,因此这里有一个完整的示例演示了该方法:
xquery version "3.1";
let $people :=
<people>
<person age="42" name="molly"/>
<person age="70" name="lucy"/>
<person age="9" name="billy"/>
</people>
let $ordered :=
(
for $person in $people/person
order by $person/@age cast as xs:integer
return
$person
)
let $oldest := $ordered[last()]
return
$oldest
这将返回露西条目。 (如果我们不将值强制转换为xs:integer
,我们将得到比利。)
但是,可能会有两个或更多的人具有相同的最大年龄。要返回所有具有最长使用期限的条目,您可以先找到最大值,然后选择具有该值的项目:
xquery version "3.1";
let $people :=
<people>
<person age="42" name="molly"/>
<person age="70" name="lucy"/>
<person age="9" name="billy"/>
<person age="70" name="holly"/>
</people>
let $ages := $people/person/@age
let $max := max($ages)
let $oldest := $people/person[@age = $max]
return
$oldest
这将返回Lucy和Holly条目。 (在这种情况下,我们不必将值强制转换为整数,因为fn:max()
函数会将类型xs:anyAtomicType
的所有值强制转换为xs:double
;请参见https://www.w3.org/TR/xpath-functions-31/#func-max。)>
或者,以更紧凑的形式:
xquery version "3.1";
let $people :=
<people>
<person age="42" name="molly"/>
<person age="70" name="lucy"/>
<person age="9" name="billy"/>
<person age="70" name="holly"/>
</people>
return
$people/person[@age = max($people/person/@age)]
答案 1 :(得分:0)
从您的代码猜测,我认为max
和for
应该可以在XPath 2.0+上使用
max(for $country in doc("world.xml")/world/country
return count(tokenize($country/@cities, '\s+')))
然后选择相应的节点
/world/country[count(tokenize(@cities, '\s+')) = max(for $country in /world/country
return count(tokenize($country/@cities, '\s+')))]