如何修改XPath以精准匹配符合多条件的指定TOKEN节点?
修正XPath以精准匹配目标TOKEN节点
咱们来梳理下问题:你需要匹配的是满足两个特定条件的TOKEN节点,但当前的XPath误返回了不符合要求的结果,核心问题出在条件的逻辑和比较对象上。
问题根源分析
- 你原本的条件2要求比较
TOKEN的BEGIN和PRIMARY下TOKEN的BEGIN,但原XPath错误地用了@END作为比较对象; - 原XPath的节点集比较逻辑不够严谨,只要PRIMARY下有任意一个
TOKEN的属性满足条件就会匹配,没有限定到同一句子范围的节点。
修正后的XPath语句
这里给出两种写法,第一种更通用(即使PRIMARY下有多个不同句子范围的TOKEN也能适配):
//TOKEN[@DOUBLE='YES'] [ exists(../../SENTENCE[@NAME='PRIMARY']/TOKEN[@SENTENCE_BEGIN=current()/@SENTENCE_BEGIN and @SENTENCE_END=current()/@SENTENCE_END]) and @BEGIN < ../../SENTENCE[@NAME='PRIMARY']/TOKEN[@SENTENCE_BEGIN=current()/@SENTENCE_BEGIN and @SENTENCE_END=current()/@SENTENCE_END]/@BEGIN ]
如果你的XML中PRIMARY下的TOKEN都属于同一个句子范围(即SENTENCE_BEGIN=0且SENTENCE_END=156),也可以用更简洁的版本:
//TOKEN[@DOUBLE='YES' and @SENTENCE_BEGIN=0 and @SENTENCE_END=156] [ @BEGIN < ../../SENTENCE[@NAME='PRIMARY']/TOKEN[@SENTENCE_BEGIN=0 and @SENTENCE_END=156]/@BEGIN ]
修正点说明
- 修正比较对象:把原XPath中的
@END替换为@BEGIN,完全符合你要求的“DOUBLE=YES的TOKEN的BEGIN值小于PRIMARY下对应TOKEN的BEGIN值”; - 限定句子范围:通过
exists()函数或者直接指定属性值,确保只匹配和PRIMARY下TOKEN同句子范围的节点; - 精准比较逻辑:在比较
BEGIN时,只针对同句子范围的PRIMARY节点进行判断,避免误匹配其他不符合条件的节点。
验证结果
使用修正后的XPath,只会返回你预期的节点:
<TOKEN BEGIN="17" END="19" SENTENCE_BEGIN="0" SENTENCE_END="156" PROP="C" DOUBLE="YES" />
内容的提问来源于stack exchange,提问作者wild card
相关产品推荐
相关产品推荐

