自定义函数中string-join()报错求助:未知函数或参数数量异常
string-join()报错问题 我之前也碰到过类似的情况,大概率是自定义函数的语法规范问题或者Xidel版本对XQuery特性的支持差异导致的。下面分步骤帮你排查和解决:
1. 检查自定义函数的语法是否符合XQuery规范
Xidel支持XQuery 3.0+的自定义函数,但写法需要严格遵循规范。你可能在函数里错误传递了string-join()的参数,或者函数的命名空间、声明逻辑有问题。
举个适配你需求的正确示例(假设你的XML结构类似<items><item id="1" name="one" type="t1"/></items>):
declare function local:format-item($item as element(item)) as xs:string { concat($item/@id, ',', $item/@name, ',', $item/@type) }; string-join(//item!local:format-item(.), '&')
这里要注意两个关键点:
- 函数声明必须以
declare function开头,明确指定命名空间(比如local:)、参数类型和返回类型 - 调用
string-join时,必须传入两个参数:要连接的字符串序列,以及分隔符'&'
2. 确认Xidel版本对string-join()的支持
旧版本的Xidel可能对XQuery 1.0+的函数支持不全,string-join()是XQuery 1.0的标准函数,但如果你的自定义函数结合了更复杂的序列生成逻辑,可能需要确保使用的是Xidel最新稳定版(比如v0.9.8及以上)。
你可以在终端运行xidel --version查看当前版本,若版本较旧,建议升级到最新版,新版本对XQuery特性的支持更完善。
3. 排查参数传递错误
如果你的string-join()调用是类似string-join($my-sequence)这种写法,必然会报错——因为string-join要求两个参数:待连接的序列,以及分隔符。必须明确指定分隔符,比如string-join($my-sequence, '&')。
另外要注意:传递给string-join的第一个参数必须是字符串序列,如果是节点序列,需要先通过data()或string()函数转换成字符串。
4. 用极简函数测试定位问题
如果还是报错,可以先写一个极简的自定义函数做测试,比如:
declare function local:test-join() as xs:string { string-join(('1,one,t1','2,two,t2'), '&') }; local:test-join()
如果这个测试函数能正常运行,说明问题出在你处理XML节点的逻辑里;如果还是报错,那基本可以确定是Xidel版本的问题,升级即可。
内容的提问来源于stack exchange,提问作者osama yaccoub

