XPath对多个标记进行分组

XPath group multiple tags

本文关键字:XPath      更新时间:2023-09-26

我使用以下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()]

不幸的是,两者都给了我一个语法错误。有可能缩短这个查询吗?

*的意思是"元素"。当然,这不包括文本节点。

此外,您的条件可以组合在一个谓词中。

//node(([(self::img或self:(text((和normalize-space((而不是(祖先::*[@id='pp_controls'](]

另一种选择是

(//img |//text(([normalize-space((]([不是(祖先::*[@id='pp_controls'](]

注意如何使用括号将谓词应用于并集。