XPath 1.0使用concat函数拼接多节点时\n换行失效问题咨询
XPath 1.0 concat多参数拼接换行失效问题解答
原因说明
XPath 1.0规范本身没有定义转义字符的解析规则,你写的\n能被识别为换行,完全是执行XPath的宿主环境(比如XML解析库、脚本运行工具、浏览器XPath引擎)额外提供的语法糖支持,这类支持普遍存在阈值限制:
- 多数宿主只会对短长度、少参数的
concat函数入参做\n转义解析,当concat的入参数量超过阈值(通常是4-5个)、或者拼接后的字符串总长度超过限制时,宿主就会跳过转义逻辑,直接把\n作为普通文本输出 - 双节点拼接的
concat参数数量刚好落在转义支持的阈值内,所以换行生效;多节点拼接的参数超过阈值,转义失效,就会直接显示\n文本
解决方案
- 方案1:直接用实际换行符代替
\n写在XPath语句中
不需要写转义序列,直接在concat的字符串参数里输入回车换行,避免宿主的转义解析环节,写法如下:
concat("To : ", /note/to , ' ', "From : ", /note/from, ' ', "Heading : ", /note/heading, ' ', "Body : ", /note/body)
这种方案不需要依赖宿主的转义支持,所有XPath 1.0引擎都能正常识别字符串里的原生换行。
- 方案2:拆分
concat调用,控制单次拼接的参数数量
如果你的工具限制了单次concat的参数阈值,可以把长拼接拆分为多次短拼接,每次拼接参数不超过4个:
concat( concat("To : ", /note/to , ' \n ', "From : ", /note/from), ' \n ', concat("Heading : ", /note/heading, ' \n ', "Body : ", /note/body) )
方案3:宿主层传入换行变量
如果你的脚本支持向XPath传入外部变量,可以在宿主语言中定义好实际的换行符作为变量传入XPath,直接使用变量拼接,完全规避转义问题。方案4:宿主层完成拼接(最稳妥)
不要在XPath中做换行拼接,先通过XPath取出所有需要的节点文本,再在你写脚本的编程语言(比如Python、JavaScript、Java)中完成字符串拼接和换行处理,这类宿主语言的换行逻辑是原生标准,不会出现失效问题。
内容的提问来源于stack exchange,提问作者Mustafa Alqanbar
相关产品推荐
相关产品推荐

