如何在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
相关产品推荐
相关产品推荐

