You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

eXist-db中嵌套XQuery聚合XML数据返回空值的问题求助

问题原因与解决方法

核心问题

你当前代码的问题有两个:

  1. 第一个循环里把NumberOfLightSpots和EquipmentType定义为属性,但第二个循环里用//NumberOfLightSpots是查询子元素,自然匹配不到任何内容,所以返回0和空值。
  2. 第二个循环只是遍历每个单文档统计结果并返回空值,没有实现“对所有文档提取单个聚合值”的需求。

另外你补充说明的目标结构是子元素形式,而非属性,这也是需要修正的点。

修正后的代码

第一步:生成每个文档的单独统计(符合你要的子元素结构)

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 07:27:39