如何用XQuery统计XML文档中不重复的作者数量?
问题分析与解决方案
原查询的问题在于:distinct-values(doc('biblio.xml')//author/(first, last)) 会将每个作者的名(first)和姓(last)拆分为独立的字符串,统计的是不重复的名字片段数量,而非完整的不重复作者数量。比如W.和Stevens会被算作两个独立值,导致结果远大于实际的不重复作者数。
正确查询方案
方案1:拼接全名作为唯一标识(通用兼容)
let $all-authors := doc('biblio.xml')//author let $unique-full-names := distinct-values($all-authors/(concat(first, ' ', last))) return count($unique-full-names)
- 逻辑:先获取所有
<author>节点,将每个作者的名和姓拼接为完整姓名字符串,再通过distinct-values去重,最后统计去重后的数量。 - 结果:返回
4(对应W. Stevens、Serge Abiteboul、Peter Buneman、Dan Suciu四位不重复作者)。
方案2:使用distinct-nodes(XQuery 3.0+支持)
如果你的XQuery处理器支持3.0及以上版本,可以直接基于节点内容去重:
let $all-authors := doc('biblio.xml')//author let $unique-authors := distinct-nodes($all-authors, function($a) { concat($a/first, ' ', $a/last) }) return count($unique-authors)
- 逻辑:通过
distinct-nodes的自定义键函数,以作者全名作为判断重复的依据,直接对<author>节点去重后统计数量。
内容的提问来源于stack exchange,提问作者الجبل العالي
相关产品推荐
相关产品推荐

