如何用XPath 1.0获取两节点间文本?通用方案及问题解析
用XPath 1.0获取两个节点之间的文本
当然可以用XPath 1.0实现这个需求!先结合你描述的场景,假设我们的XML结构大概是这样(方便理解示例):
<root> <A> B <C/> <F/> G <D/> </A> </root>
你需要获取<F/>和<D/>之间的文本"G",可以用下面的XPath表达式:
string(/root/A/text()[preceding-sibling::F][following-sibling::D])
表达式拆解:
/root/A/text():先选中<A>节点下的所有文本子节点(也就是"B"和"G"这两个文本节点)[preceding-sibling::F]:筛选出前面存在<F>元素节点的文本节点,这一步会把"B"排除,只留下"G"[following-sibling::D]:再筛选出后面存在<D>元素节点的文本节点,确保我们取的是<D>之前的内容string(...):将选中的文本节点转换为字符串值,最终得到"G"
如果<F>和<D>之间有多个文本节点,这个表达式会自动把它们的内容拼接起来,和XPath 2.0的行为一致。
关于你遇到的问题分析:
你提到从A到D查询能得到"B C F G",这应该是因为你选中了<A>下所有在<D>之前的节点(包括元素和文本),它们的字符串值被拼接在了一起。而从F到D查询返回空,大概率是因为你只筛选了元素节点(比如用了following-sibling::*),忽略了文本节点;或者是错误地使用了范围选择(XPath 1.0不支持直接用F to D这种语法)。
换一种从<F>出发的写法也能实现需求:
string(/root/A/F/following-sibling::node()[following-sibling::D][self::text()])
这个表达式从<F>开始,找它之后的所有同级节点(包括元素和文本),先筛选出在<D>之前的,再只保留文本节点,最后取字符串值。
总之,XPath 1.0完全能搞定这个需求,核心就是利用preceding-sibling和following-sibling轴精准筛选出两个节点之间的文本节点~
内容的提问来源于stack exchange,提问作者Patrick L.
相关产品推荐
相关产品推荐

