XPath分组多个标签

3
我使用以下XPath从文档中获取所有非空文本和图像节点,但排除ID为“mpp_controls”的div中的节点:
//img[not(ancestor::*[@id='mpp_controls'][normalize-space()])] | //text()[not(ancestor::*[@id='mpp_controls'])][normalize-space()]

由于这两个元素的谓词相同,而且我可能会在将来对类似查询添加更多标签,因此我试图缩短它。参考这个答案,我得出了以下结论:

//*[self::img or self::text()][not(ancestor::*[@id='mpp_controls'])][normalize-space()]

我也尝试过:

//*[img or text()][not(ancestor::*[@id='mpp_controls'])][normalize-space()]

很不幸,两个语句都给我带来了语法错误。有没有可能缩短这个查询语句呢?
1个回答

1

* 表示 "元素"。自然地,这不包括文本节点。

此外,您的条件可以合并为一个谓词。

//node()[
  (self::img or self::text())
  and normalize-space()
  and not(ancestor::*[@id='mpp_controls'])
]

另一种选择是

(//img | //text()[normalize-space()])[
  not(ancestor::*[@id='mpp_controls'])
]

请注意,您可以使用括号将谓词应用于联合。


1
非常感谢您的解释,我真的很喜欢这种替代格式。现在我应该能够为我的当前项目形成所有需要的查询了! - NotABlueWhale
另一种方法也应该更加高效,因为它开始时就可以在较少的节点上工作。 - Tomalak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接