【问题标题】:xpath normalize-space with contains [duplicate]xpath normalize-space with contains [重复]
【发布时间】:2019-04-13 06:08:35
【问题描述】:

我有一个 xpath 字符串 //*[normalize-space() = "some sub text"]/text()/.. 如果我找到的文本位于没有多个文本子节点的节点中,它可以正常工作,但如果有,那么它将不起作用,所以我正在尝试结合它与contains() 如下://*[contains(normalize-space(), "some sub text")]/text()/.. 确实有效,但它总是返回bodyhtml 标签以及包含文本的p 标签。如何更改它使其只返回 p 标记?

【问题讨论】:

  • 共享相同的 HTML 代码示例以及当前和所需的输出

标签: xpath


【解决方案1】:

这完全取决于您要匹配的内容。

最可能的情况是,如果 some text 出现在元素的规范化字符串值中的任何位置,您可能希望匹配它,可能会在不同级别的多个文本节点中拆分:例如以下任何一种:

<p>some text</p>
<p>There was some text</p>
<p>There was <b>some text</b></p>
<p>There <b>was</b> some text</p>
<p>There was <b>some</b> <!--italic--> <i>text</i></p>
<p>There was <b>some</b> text</p>

如果是这样,请使用//p[contains(normalize-space(.), "some text")]

正如您所指出的,将//* 与此谓词一起使用也将匹配相关元素的祖先元素。解决此问题的最简单方法是使用//p 说出您要查找的元素。如果您不知道要查找的元素,则可以在 XPath 3.0 中使用

innermost(//*[contains(normalize-space(.), "some text")])

但是如果您不幸没有使用 XPath 3.0,那么您可以使用 (//*[contains(normalize-space(.), "some text")])[last()],尽管如果有多个段落具有所需的内容,这不会完全一样。

如果您不想匹配以上所有内容,但想要更有选择性,那么您需要更清楚地说明您的要求。

无论哪种方式,在路径表达式中使用text() 通常是一种代码异味,除非在极少数情况下,您只想在元素中选择未包含在其他标签中的文本。

【讨论】:

  • 写完这个答案后标记为重复。
猜你喜欢
  • 2010-12-22
  • 1970-01-01
  • 2019-08-26
  • 2017-05-21
  • 1970-01-01
  • 2012-07-07
  • 2014-02-02
  • 2015-02-20
  • 1970-01-01
相关资源
最近更新 更多