dom改进XPath-query以正确区分文本节点



我过去广泛使用XPath。目前我正面临一个问题,我无法解决。

约束

  • 纯 XPath 1.0
  • 没有辅助函数(例如没有"concat(("(

HTML 标记

<span class="container">
Peter: Lorem Impsum
<i class="divider" role="img" aria-label="|"></i>
Paul Smith: Foo Bar BAZ
<i class="divider" role="img" aria-label="|"></i>
Mary: One Two Three
</span>

挑战

我想提取三个连贯字符串:

  • 彼得:洛雷姆·英普苏姆
  • 保罗·史密斯:Foo Bar BAZ
  • 玛丽:一二三

XPath

以下XPath查询是我经过数小时研究后想出的最好的查询:

XPath-query 1

//span[contains(@class, "container")]
=> Peter: Lorem ImpsumPaul Smith: Foo Bar BAZMary: One Two Three

XPath-query 2

//span[contains(@class, "container")]//text()
Peter: Lorem Impsum Paul Smith: Foo Bar BAZ Mary: One Two Three

问题

尽管之后可以使用(PHP(字符串函数对生成的字符串进行后处理,但我无法将其拆分为正确的三个块:我需要一个XPath查询,它使我能够正确区分文本节点

是否可以在文本节点之间集成一些"人工分隔符"?

你对 XPath 1.0 的期望太高了。 XPath 1.0本身可以帮助您在此处选择

  1. 字符串,或
  2. 一组文本节点

然后,您必须在XPath之外完成处理(正如Mads在评论中建议的那样(。

要了解您遇到的极限,您的第一个 XPath,

//span[contains(@class, "container")]

选择span元素的节点集。 XPath 1.0 运行的环境向您显示文档中单个此类节点的字符串值(某些变体(:

Peter: Lorem ImpsumPaul Smith: Foo Bar BAZMary: One Two Three

但要清楚:您的 XPath 选择的是span元素的节点集,而不是此处的字符串。

你的第二个XPath,

//span[contains(@class, "container")]//text()

选择text()节点的节点集。 XPath 1.0 运行的环境显示每个选定text()节点的字符串值

如果可以使用 XPath2.0,则可以直接在 XPath 中选择一个字符串序列

//span[contains(@class, "container")]/text()/string()

或者你可以加入他们,

string-join(//span[contains(@class, "container")]/text(), "|")

并直接获得

Peter: Lorem Impsum
|
Paul Smith: Foo Bar BAZ
|
Mary: One Two Three

string-join(//span[contains(@class, "container")]/text()/normalize-space(), "|")

要得到

Peter: Lorem Impsum|Paul Smith: Foo Bar BAZ|Mary: One Two Three

最新更新