如何用XPath定位符合特定兄弟标签模式的<b>标签并识别异常
XPath 定位符合/不符合指定兄弟标签序列的<b>标签
核心模式说明
要求定位的正确<b>标签需处于以下同级标签序列中:<astart/> ... <bstart/> ... <b>..</b> ... <bend/> ... <aend/>
所有标签均为兄弟节点,<a>标签为可选(不影响核心序列判断)。
1. 定位符合模式的正确<b>标签
使用以下XPath表达式,精准匹配处于<bstart>与<bend>之间,且该<bstart>-<bend>块又处于<astart>-<aend>块内的<b>标签:
//b[ # 当前<b>的最近前置兄弟是<bstart>,中间无其他冲突标签 preceding-sibling::*[1][self::bstart] # 当前<b>的最近后置兄弟是<bend>,中间无其他冲突标签 and following-sibling::*[1][self::bend] # 包裹的<bstart>在<astart>之后,且<astart>与<bstart>之间无<aend> and preceding-sibling::astart[not(following-sibling::aend[preceding-sibling::*[1] = preceding-sibling::bstart[1]])] # 包裹的<bend>在<aend>之前,且<bend>与<aend>之间无<astart> and following-sibling::aend[not(preceding-sibling::astart[following-sibling::*[1] = following-sibling::bend[1]])] ]
2. 定位不符合模式的错误<b>标签
对正确标签的判断逻辑取反即可:
//b[not( preceding-sibling::*[1][self::bstart] and following-sibling::*[1][self::bend] and preceding-sibling::astart[not(following-sibling::aend[preceding-sibling::*[1] = preceding-sibling::bstart[1]])] and following-sibling::aend[not(preceding-sibling::astart[following-sibling::*[1] = following-sibling::bend[1]])] )]
原表达式失效原因分析
你之前使用的表达式:
//b[preceding-sibling::astart[1][not(preceding-sibling::bstart[1])]][following-sibling::aend[1][not(following-sibling::bend[1])]]
逻辑完全偏离核心要求:
- 错误要求
<b>的最近前置兄弟是,但正确模式中 <b>的最近前置应该是<bstart> - 要求
<aend>的最近后置兄弟不是<bend>,与<bend>需在<aend>之前的逻辑矛盾 - 未对
<bstart>和<bend>的包裹关系做有效判断
示例XML
正确结构示例
<root> <astart/> <bstart/> <b>正确的b标签</b> <bend/> <aend/> </root>
错误结构示例
<root> <b>错误:不在任何astart-aend或bstart-bend块内</b> <astart/> <b>错误:在astart后但未进入bstart-bend块</b> <bstart/> <bend/> <b>错误:在bend块结束后、aend前</b> <aend/> </root>
内容的提问来源于stack exchange,提问作者BWin
相关产品推荐
相关产品推荐

