如何用XPath将节点内ID转换为单引号分隔的序列字符串
XPath实现分号分隔ID转单引号包裹的逗号序列
适用XPath 2.0及以上版本(推荐)
XPath 2.0+提供了tokenize和string-join这类字符串处理函数,能简洁实现需求:
concat( '(', string-join( for $id in tokenize(normalize-space(sf:Direct_Models_Ids__c), ';')[normalize-space($id) != ''] return concat('''', $id, ''''), ',' ), ')' )
步骤拆解:
normalize-space(sf:Direct_Models_Ids__c):清理节点文本的前后空格,同时合并中间多余空格(避免ID里意外带空格)tokenize(..., ';'):将清理后的文本按分号拆分为字符串序列[normalize-space($id) != '']:过滤拆分后产生的空字符串(比如原文本末尾的分号会生成空元素)concat('''', $id, ''''):给每个有效ID包裹单引号(XPath中单引号需用两个单引号转义)string-join(..., ','):用逗号连接所有带单引号的IDconcat('(', ..., ')'):给整个序列包裹外层括号
将上述表达式结果放入<F_model_ids>节点即可得到目标输出。
适用XPath 1.0版本(兼容旧环境)
XPath 1.0没有原生的拆分和序列处理函数,只能通过字符串替换和截取实现,局限性是无法处理连续分号的情况:
concat( '(', substring( translate( normalize-space(sf:Direct_Models_Ids__c), ';', ''',''' ), 1, string-length(translate(normalize-space(sf:Direct_Models_Ids__c), ';', ''',''')) - 2 ), ')' )
步骤拆解:
normalize-space(...):同样先清理文本空格translate(..., ';', ''','''):将所有分号替换为','',把分号分隔的ID变成'ID1',''ID2',''这样的格式substring(..., 1, ... - 2):截取掉末尾多余的两个单引号(原文本末尾分号替换后会多出'')concat('(', ..., ')'):包裹外层括号
注意:如果原文本存在连续分号(比如ID1;;ID2),这种方法会生成'ID1','','ID2'的无效序列,所以优先推荐XPath 2.0+的方案。
内容的提问来源于stack exchange,提问作者Sai kris
相关产品推荐
相关产品推荐

