我有一个包含以下条目的XML文件:
<file>
<unit id="u-1.01"/>
<unit id="u-1.02"/>
<unit id="u-1.03"/>
<unit id="u-1.04"/>
<unit id="u-1.05"/>
<unit id="u-1.06"/>
<unit id="u-1.07"/>
<unit id="u-2.01"/>
<unit id="u-2.02"/>
<unit id="u-2.03"/>
<unit id="u-2.04"/>
<unit id="u-2.05"/>
<unit id="u-2.06"/>
</file>
我想使用下面的查询计算不同值的数量。
查询遍历每个 @id 属性,并选择字符串中的第三个字符。
declare function local:count-base-pages($basefile) {
for $identifiers in $basefile/unit/@id
let $id := distinct-values(substring($identifiers, 3, 1))
return count($id)
};
但是,此查询返回以下序列:
1 1 1 1 1 1 1 2 2 2 2 2 2
希望的结果是2
因为有两个不同的值:1和2。
我如何滥用 distinct-values 和 count 函数?
答案 0 :(得分:2)
您需要围绕实际的FLWOR表达式包装函数:count(distinct-values(for ... return ...))
答案 1 :(得分:1)
使用较短的:
count(distinct-values(/*/*/@id/substring(.,3,1)))
在提供的XML文档上执行上述XQuery :
<file>
<unit id="u-1.01"/>
<unit id="u-1.02"/>
<unit id="u-1.03"/>
<unit id="u-1.04"/>
<unit id="u-1.05"/>
<unit id="u-1.06"/>
<unit id="u-1.07"/>
<unit id="u-2.01"/>
<unit id="u-2.02"/>
<unit id="u-2.03"/>
<unit id="u-2.04"/>
<unit id="u-2.05"/>
<unit id="u-2.06"/>
</file>
生成想要的正确结果:
2