【问题标题】:xpath return all non-blank text nodes not descendant of `a`, `style` or `script`xpath 返回所有非空白文本节点,而不是 `a`、`style` 或 `script` 的后代
【发布时间】:2012-06-30 10:38:00
【问题描述】:

什么表达式会选择所有文本节点:

  • 不是空白
  • 不在ascriptstyle 内?

【问题讨论】:

  • 好问题,+1。请参阅我的答案,以获得比当前接受的更短且更有效的 XPath 表达式。 :)

标签: xpath


【解决方案1】:

使用

//*[not(self::a or self::script or self::style)]/text()[normalize-space()]

此表达式不仅比当前接受的答案中的表达式短,而且还可能更有效

请注意,该表达式根本不使用任何(后退/上)向轴。

【讨论】:

  • +1 谢谢。用 firebug 测试,确实缩短了获取节点的时间。
  • @Majid:不客气。如果这比当前接受的答案更好,您可以考虑接受我的答案。
  • 我会的,这对热情地回答我问题的其他人来说是不是很粗鲁。
  • 先生 normalize-space() 在 nodetest 中做什么?
  • TLDR:不选择非空白节点。 normalize-space 函数从字符串中去除前导和尾随空白,用单个空格替换空白字符序列,并返回结果字符串。 developer.mozilla.org/en-US/docs/Web/XPath/Functions/… 所以这会在节点只有空格的情况下返回空字符串,这意味着节点测试失败(空字符串为假:stackoverflow.com/questions/346226/…)并且只包含空格的节点被省略。
【解决方案2】:

应该这样做,假设“不在内部”意味着文本节点不应该是“a”或“脚本”或“样式”元素的后代。如果“不在内部”仅意味着不应该是孩子,则使用 parent::a 等等而不是祖先::a。

//text()[normalize-space() and not(ancestor::a | ancestor::script | ancestor::style)]

【讨论】:

  • 需要您的帮助 - /books/child::*/books/child::node() 之间有什么区别吗?
  • 是否可以有条件 //text()[not(ancestor::a)] 但允许一些特定的单词列表?就像如果链接在“家”这个词上,那么我们会保留它。还是完全荒谬?
【解决方案3】:

我使用了 Dimitre Novatchev 的答案,但后来我偶然发现了主题启动者描述的问题:

不是astylescript后代

Dimitre 的答案不包括 style 标签,但包括其子标签。 此版本还排除了stylescriptnoscript 标签它们的后代:

//div[@id='???']//*[not(ancestor-or-self::script or ancestor-or-self::noscript or ancestor-or-self::style)]/text()

无论如何,感谢 Dimitre Novatchev。

【讨论】:

  • +1 没试过,不过从你的描述来看,这个方法比较健壮。
  • @warvariuc:为什么你认为<style> 元素可以有(元素)子元素?我搜索了这个——这里可以看到没有提到这样的语法:developer.mozilla.org/en-US/docs/Web/HTML/Element/style
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-22
  • 2011-08-29
  • 1970-01-01
  • 2017-05-01
  • 1970-01-01
相关资源
最近更新 更多