XPath节点筛选疑问:如何排除polarity=negative的dependent节点
XPath筛选节点问题排查与解决
原始XML结构
<node1> <node11> <dependent>Retain</dependent> <dependent polarity="positive">Retain</dependent> <dependent polarity="negative">Discard</dependent> </node11> <dependent>Retain</dependent> <dependent polarity="positive">Retain</dependent> <dependent polarity="negative">Discard</dependent> <somethingelse>Retain</somethingelse> </node1>
需求
- 返回所有非
dependent节点; - 返回不含
polarity属性的dependent节点; - 返回
polarity属性值为positive的dependent节点。
预期结果
<node1> <node11> <dependent>Retain</dependent> <dependent polarity="positive">Retain</dependent> </node11> <dependent>Retain</dependent> <dependent polarity="positive">Retain</dependent> <somethingelse>Retain</somethingelse> </node1>
尝试的错误表达式
//*[not(self::dependent) or (descendant-or-self::dependent[not(@polarity)]) or (descendant-or-self::dependent[@polarity='positive'])]
问题分析
你的表达式逻辑核心错误:用descendant-or-self::dependent[...]判断节点是否保留,只会检查当前节点或其后代是否存在符合条件的dependent,但不会过滤当前节点下不符合条件的子节点。比如node11会被选中,因为它有符合条件的dependent后代,但它下面polarity="negative"的dependent并没有被排除——你的表达式没有针对这个dependent节点本身做判断,只是判断父节点是否符合保留条件,导致父节点被保留后,所有子节点也跟着被包含进来。
正确的XPath表达式
要实现需求,需要针对每个节点本身做判断:
//*[ not(self::dependent) or (self::dependent and (not(@polarity) or @polarity='positive')) ]
逻辑说明
- 非
dependent节点:直接保留; dependent节点:仅当无polarity属性,或polarity值为positive时才保留。
该表达式会选中所有符合条件的节点,同时自动保留树形结构(父节点符合条件则被选中,其下符合条件的子节点也会被选中,不符合的子节点会被排除)。
内容的提问来源于stack exchange,提问作者balin
相关产品推荐
相关产品推荐

