改进XPath查询以正确区分文本节点

问题描述 投票:0回答:1

我过去常常使用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>

挑战

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

  • 彼得,LOREM Impsum
  • 保罗史密斯:Foo Bar BAZ
  • 玛丽:一二三

XPath的

以下XPath查询是我在研究HOURS后得出的最好的:

XPath查询1

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

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

XPath查询2

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

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

问题

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

是否有可能在文本节点之间集成一些“人工分离器”?

xpath domxpath xpath-1.0 xpathquery
1个回答
1
投票

你对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()节点的字符串值。

如果你可以使用XPath 2.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
© www.soinside.com 2019 - 2024. All rights reserved.