eXist-db中嵌套XQuery聚合XML数据返回空值的问题求助
问题原因与解决方法
核心问题
你当前代码的问题有两个:
- 第一个循环里把
NumberOfLightSpots和EquipmentType定义为属性,但第二个循环里用//NumberOfLightSpots是查询子元素,自然匹配不到任何内容,所以返回0和空值。 - 第二个循环只是遍历每个单文档统计结果并返回空值,没有实现“对所有文档提取单个聚合值”的需求。
另外你补充说明的目标结构是子元素形式,而非属性,这也是需要修正的点。
修正后的代码
第一步:生成每个文档的单独统计(符合你要的子元素结构)
let $per_sheet_stats := for $sheet in collection('/db/light') return <sheet> <NumberOfLightSpots>{count($sheet//LightSpot)}</NumberOfLightSpots> <EquipmentType>{distinct-values($sheet//EquipmentType)}</EquipmentType> </sheet>
这一步会为每个源文档生成一个包含统计数据的<sheet>节点,结构完全符合你补充的要求。
第二步:对所有文档的统计结果做聚合
如果需要得到所有文档的总聚合值(比如总灯光点数、全量唯一设备类型),在上述代码后追加:
return <total_aggregation> <TotalNumberOfLightSpots>{sum($per_sheet_stats//NumberOfLightSpots/xs:integer(.))}</TotalNumberOfLightSpots> <AllDistinctEquipmentTypes>{distinct-values($per_sheet_stats//EquipmentType)}</AllDistinctEquipmentTypes> </total_aggregation>
完整代码
let $per_sheet_stats := for $sheet in collection('/db/light') return <sheet> <NumberOfLightSpots>{count($sheet//LightSpot)}</NumberOfLightSpots> <EquipmentType>{distinct-values($sheet//EquipmentType)}</EquipmentType> </sheet> return <total_aggregation> <TotalNumberOfLightSpots>{sum($per_sheet_stats//NumberOfLightSpots/xs:integer(.))}</TotalNumberOfLightSpots> <AllDistinctEquipmentTypes>{distinct-values($per_sheet_stats//EquipmentType)}</AllDistinctEquipmentTypes> </total_aggregation>
代码说明
- 把统计数据从属性改为子元素,确保后续查询能正确匹配到值。
- 使用
sum()对所有文档的灯光点数求和,注意要把节点值转为整数类型(xs:integer(.))避免类型错误。 - 再次使用
distinct-values()对所有文档的设备类型去重,得到全局唯一的设备类型列表。
内容的提问来源于stack exchange,提问作者Fabio
相关产品推荐
相关产品推荐

