如何使用XPath 1.0提取XML中冒号分隔串最后组的中间数字
XPath 1.0提取最后一组数字的中间值解决方案
给定XML文档:
<a> <b> 1,2,3 : 4,5,6 : 7,8,9 : 10,11,12 </b> </a>
标签内的内容以:(空格+冒号+空格)为分隔符,包含1-10组逗号分隔的数字,需用XPath 1.0提取最后一组的中间值(示例中为11)。
由于XPath 1.0没有字符串分割、反转这类高级函数,只能通过嵌套substring-after、substring-before和normalize-space实现,以下是可行方案:
完整表达式
substring-before(substring-after( normalize-space( if (substring-after(substring-after(substring-after(substring-after(substring-after(substring-after(substring-after(substring-after(substring-after(/a/b," : ")," : ")," : ")," : ")," : ")," : ")," : ")," : ")," : ")," : ") != '' then substring-after(substring-after(substring-after(substring-after(substring-after(substring-after(substring-after(substring-after(substring-after(/a/b," : ")," : ")," : ")," : ")," : ")," : ")," : ")," : ")," : ")," : ") else if (substring-after(substring-after(substring-after(substring-after(substring-after(substring-after(substring-after(substring-after(/a/b," : ")," : ")," : ")," : ")," : ")," : ")," : ")," : ") != '' then substring-after(substring-after(substring-after(substring-after(substring-after(substring-after(substring-after(substring-after(/a/b," : ")," : ")," : ")," : ")," : ")," : ")," : ")," : ") else if (substring-after(substring-after(substring-after(substring-after(substring-after(substring-after(substring-after(/a/b," : ")," : ")," : ")," : ")," : ")," : ")," : ") != '' then substring-after(substring-after(substring-after(substring-after(substring-after(substring-after(substring-after(/a/b," : ")," : ")," : ")," : ")," : ")," : ")," : ") else if (substring-after(substring-after(substring-after(substring-after(substring-after(substring-after(/a/b," : ")," : ")," : ")," : ")," : ")," : ") != '' then substring-after(substring-after(substring-after(substring-after(substring-after(substring-after(/a/b," : ")," : ")," : ")," : ")," : ")," : ") else if (substring-after(substring-after(substring-after(substring-after(substring-after(/a/b," : ")," : ")," : ")," : ")," : ") != '' then substring-after(substring-after(substring-after(substring-after(substring-after(/a/b," : ")," : ")," : ")," : ")," : ") else if (substring-after(substring-after(substring-after(substring-after(/a/b," : ")," : ")," : ")," : ") != '' then substring-after(substring-after(substring-after(substring-after(/a/b," : ")," : ")," : ")," : ") else if (substring-after(substring-after(substring-after(/a/b," : ")," : ")," : ") != '' then substring-after(substring-after(substring-after(/a/b," : ")," : ")," : ") else if (substring-after(substring-after(/a/b," : ")," : ") != '' then substring-after(substring-after(/a/b," : ")," : ") else if (substring-after(/a/b," : ") != '' then substring-after(/a/b," : ") else /a/b ), ","), "," )
逻辑说明
- 提取最后一组数字:通过嵌套9次
substring-after并逐层判断结果是否为空,覆盖1-10组的所有情况,用normalize-space去除前后空格,避免干扰后续分割。 - 提取中间值:对最后一组(格式为
X,Y,Z),先用substring-after获取逗号后的部分,再用substring-before截取第二个逗号前的内容,得到中间数字。
内容的提问来源于stack exchange,提问作者Crystal Jr
相关产品推荐
相关产品推荐

