计算每个属性中的单词数

时间:2018-11-16 14:00:55

标签: xml xpath xquery

如何计算每个元素在特定属性中的字数?

示例:我想计算每个国家有多少个城市,城市是这样的属性: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)

但是我如何获得最大数量?

2 个答案:

答案 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)

从您的代码猜测,我认为maxfor应该可以在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+')))]