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

如何在XQuery函数中收集节点的属性与属性值?代码问题排查及修正请求

分析你的XQuery函数问题及修正方案

先拆解你代码里的几个核心问题,这些是导致函数无法正常执行的关键:

1. 循环语法与属性获取错误

你的for循环存在两处语法问题:

  • 括号不匹配:for ($element at $col in (attribute_list($my_node)) 末尾缺少一个闭合括号,导致语法解析失败
  • 不存在attribute_list函数:XQuery中获取节点的所有属性,正确写法是$my_node/@*,而非这个虚构的函数

2. 多余的语句分号

XQuery里变量声明语句不需要以分号结尾,你写的let $complete_row_information := concat ("test", "test2"); 中的分号是语法错误,会直接导致函数无法编译。

3. 未正确聚合结果

当前循环会为每个属性返回单独的字符串,但你需要的是将所有属性信息拼接成单个JSON字符串,因此需要用聚合函数把零散的键值对整合起来,再包裹成合法的JSON结构。

4. 参数类型可以更精准

你声明的参数是node()*(允许多个节点),但你明确说函数接收单个节点,改成node()更符合需求,避免意外传入多节点的情况。


修正后的完整函数

下面是实现你需求的正确代码,它会遍历节点所有属性,生成标准的JSON字符串:

declare function local:Do_the_thing($my_node as node()) as xs:string {
  let $attribute_pairs := 
    for $attr in $my_node/@*
    return concat('"', xs:string(local-name($attr)), '": "', xs:string($attr), '"')
  let $json_content := string-join($attribute_pairs, ", ")
  return concat("{", $json_content, "}")
};

代码细节说明:

  • $my_node/@*:遍历传入节点的全部属性
  • local-name($attr):获取属性的本地名称(不带命名空间前缀)
  • string-join($attribute_pairs, ", "):把每个属性的键值对用逗号分隔拼接成整体
  • 最后用{}包裹内容,形成标准的JSON对象格式

测试示例

假设你有如下XML节点:

<book title="XQuery 101" author="John Doe" year="2024"/>

调用local:Do_the_thing(/book)会返回:

{"title": "XQuery 101", "author": "John Doe", "year": "2024"}

内容的提问来源于stack exchange,提问作者Raimo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 20:47:40