如何统计mynode与最近祖先a节点间的b节点数量?
解决XPath统计特定范围祖先节点数量的问题
问题场景
给定如下XML结构:
<a> <b> <a> <c> <a> <b> <mynode> </mynode> </b> <c> <b> </b> </c> </a> </c> <d> </d> </a> </b> </a>
当当前节点为<mynode>时,需要统计最近的祖先<a>节点到<mynode>之间的所有<b>祖先节点数量(示例结果为1)。
错误写法分析
你尝试的ancestor::a[last()]//b存在两个问题:
ancestor::a[last()]选取的是最远的祖先<a>(而非最近的),范围错误;//b会选取该<a>下所有后代<b>,包括非<mynode>祖先的节点(比如示例中同级<c>下的<b>),统计范围不准确。
正确XPath实现
以下两种写法均可得到正确结果:
写法一:基于祖先节点过滤
count(ancestor::b[ancestor::a[1] is current()/ancestor::a[1]])
ancestor::b:获取<mynode>的所有<b>祖先节点;- 谓词
[ancestor::a[1] is current()/ancestor::a[1]]:过滤出那些<b>节点,其最近的<a>祖先与<mynode>最近的<a>祖先相同,确保这些<b>处于目标范围内。
写法二:反向从最近<a>查找后代祖先
count(ancestor::a[1]/descendant-or-self::b[ancestor::mynode])
ancestor::a[1]:定位到<mynode>最近的<a>祖先;descendant-or-self::b[ancestor::mynode]:选取该<a>下所有属于<mynode>祖先的<b>节点,即目标范围内的节点。
两种写法在示例中都会返回1,符合需求。
内容的提问来源于stack exchange,提问作者ThylowZ
相关产品推荐
相关产品推荐

