【发布时间】:2012-06-30 10:38:00
【问题描述】:
什么表达式会选择所有文本节点:
- 不是空白
-
不在在
a、script或style内?
【问题讨论】:
-
好问题,+1。请参阅我的答案,以获得比当前接受的更短且更有效的 XPath 表达式。 :)
标签: xpath
什么表达式会选择所有文本节点:
a、script 或style 内?【问题讨论】:
标签: xpath
使用:
//*[not(self::a or self::script or self::style)]/text()[normalize-space()]
此表达式不仅比当前接受的答案中的表达式短,而且还可能更有效。
请注意,该表达式根本不使用任何(后退/上)向轴。
【讨论】:
normalize-space() 在 nodetest 中做什么?
normalize-space 函数从字符串中去除前导和尾随空白,用单个空格替换空白字符序列,并返回结果字符串。 developer.mozilla.org/en-US/docs/Web/XPath/Functions/… 所以这会在节点只有空格的情况下返回空字符串,这意味着节点测试失败(空字符串为假:stackoverflow.com/questions/346226/…)并且只包含空格的节点被省略。
应该这样做,假设“不在内部”意味着文本节点不应该是“a”或“脚本”或“样式”元素的后代。如果“不在内部”仅意味着不应该是孩子,则使用 parent::a 等等而不是祖先::a。
//text()[normalize-space() and not(ancestor::a | ancestor::script | ancestor::style)]
【讨论】:
/books/child::* 和 /books/child::node() 之间有什么区别吗?
我使用了 Dimitre Novatchev 的答案,但后来我偶然发现了主题启动者描述的问题:
不是
a、style或script的后代
Dimitre 的答案不包括 style 标签,但包括其子标签。
此版本还排除了style、script、noscript 标签和它们的后代:
//div[@id='???']//*[not(ancestor-or-self::script or ancestor-or-self::noscript or ancestor-or-self::style)]/text()
无论如何,感谢 Dimitre Novatchev。
【讨论】:
<style> 元素可以有(元素)子元素?我搜索了这个——这里可以看到没有提到这样的语法:developer.mozilla.org/en-US/docs/Web/HTML/Element/style