如何在XQuery中连接字符串且无末尾分隔符?实例求解
嘿,我来帮你解决这个XQuery里字符串连接的问题!你现在遇到的末尾多余分隔符的情况很常见,其实有几个简单的办法能搞定,我给你一步步说:
最优方案:使用
string-join()函数 这是最简洁也最推荐的方法,XQuery内置的string-join()函数专门用来处理字符串序列的连接,它会自动用指定的分隔符拼接序列中的元素,完全不会在末尾添加多余的分隔符。
针对你的场景,只需要把循环替换成这个函数即可:
<friends> { string-join( volunteerDatabase/person/name/lastname/string(), ' + ' ) } </friends>
- 第一个参数是要连接的字符串序列:
volunteerDatabase/person/name/lastname/string()会提取所有姓氏的字符串值,形成一个序列 - 第二个参数是分隔符:
' + '就是你想要的连接符
运行这段代码后,你会得到期望的结果:
<friends>Geller + Bing + Tribbiani</friends>
备选方案:利用位置判断(兼容旧版XQuery)
如果你使用的XQuery版本不支持string-join()(这种情况现在很少见了),可以通过循环时判断当前元素的位置来避免末尾分隔符:
<friends> { for $lastname at $pos in volunteerDatabase/person/name/lastname return if ($pos = last()) then $lastname/string() <!-- 最后一个元素直接返回字符串,不加分隔符 --> else concat($lastname/string(), ' + ') <!-- 非最后一个元素拼接分隔符 --> } </friends>
这里用at $pos获取当前元素在序列中的位置,再用last()判断是否为最后一个元素,从而决定是否添加分隔符。
不推荐但可行的方案:截断末尾多余字符
还有一种思路是先拼接所有带分隔符的字符串,再去掉末尾的分隔符,但这种方法不够灵活(如果分隔符长度变化,你需要手动调整截断的长度),所以只作为备选:
<friends> { let $all-with-sep := concat( for $ln in volunteerDatabase/person/name/lastname return concat($ln/string(), ' + ') ) return substring($all-with-sep, 1, string-length($all-with-sep) - 3) <!-- 因为' + '是3个字符,所以截断最后3位 --> } </friends>
这种方法容易出错,比如如果序列为空的话会报错,所以优先推荐前两种方法。
内容的提问来源于stack exchange,提问作者Smaointe
相关产品推荐
相关产品推荐

