1

我有一个包含以下条目的 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-valuescount函数?

4

2 回答 2

2

您需要将函数包装在实际的 FLWOR 表达式周围:count(distinct-values(for ... return ...))

于 2012-09-13T12:56:34.107 回答
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
于 2012-09-13T14:16:16.943 回答