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()]

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

4

1 回答 1

1

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

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

//节点()[
  (self::img 或 self::text())
  和规范化空间()
  而不是(祖先::*[@id='mpp_controls'])
]

另一种选择是

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

请注意如何使用括号将谓词应用于联合。

于 2013-11-06T23:19:31.793 回答