识别文本出现最少次数的元素的正确 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
的元素
我正在尝试识别具有特定文本的元素,但我只想在所需文本出现特定次数时识别该元素。
例如,假设我们在同一页面上有以下两个 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