识别文本出现最少次数的元素的正确 XPath 是什么?

What is the Correct XPath to Identify Element with Text Occuring Minimum Number of Times?

我正在尝试识别具有特定文本的元素,但我只想在所需文本出现特定次数时识别该元素。

例如,假设我们在同一页面上有以下两个 HTML 片段:

片段 1:

<span id="price">

.46

<span>
([=10=].38 /  Count)
</span>
  
</span>

片段 2:

<span id="price">.38</span>

我可以使用 XPath 识别这两个元素:.//span[contains(text(),'$')] 但是,我只想识别该元素(或 span 元素的任何后代)至少包含该字符的两个实例:$

在上面的例子中,它只会识别第一个片段,因为第二个片段只包含一个 $ 的实例,而不是两个。

要使用的正确 XPath 语法是什么?

您可以使用 XPath //span[count(.//text()[contains(., "$")]) >= 2]

这是一个比较复杂的XPath,所以通过向外扩展来解释一下:

.//text()[contains(., "$")]

Select 从自身包含“$”的当前节点下降的所有文本元素。

count(.//text()[contains(., "$")])

计算从当前节点开始下降的自身包含“$”的文本元素的数量。

//span[count(.//text()[contains(., "$")]) >= 2]

Select 所有 span 个具有两个或多个自身包含“$”的文本后代的元素

请注意,这仅在美元符号位于两个不同的文本元素中时才有效。如果您想在此示例中包含 span

<span>
    $$
    <span>
    foo
    </span>
</span>

...那么您将需要一种不同的方法:

//span[string-length(.) - string-length(translate(., "$", "")) >= 2]

此谓词将跨度的字符串长度与删除所有“$”字符后相同跨度的字符串长度进行比较。

一个可用的 XPath-1.0 表达式是

string-length(/span[@id='price'])-string-length(translate(/span[@id='price'],'$',''))

在谓词中这可能看起来像

//span[string-length(.)-string-length(translate(.,'$',''))>=2]

此表达式仅选择计数为 $ >= 2

的元素