在两个特定图元之间选择图元



我有以下HTML:

<table>
<tbody>
<tr class="Menu indent0 picker-parent open"></tr>
<tr class="divider MenuGroup"></tr>
<tr class="MenuGroup closed indent1 picker-parent"></tr>
<tr class="MenuGroup indent1 picker-parent open"></tr>
<tr class="divider MenuGroup"></tr>
---><tr class="MenuItem indent2 picker-parent"></tr>
---><tr class="MenuItem indent2 picker-parent"></tr>
---><tr class="MenuItem closed indent2 picker-parent"></tr>
---><tr class="MenuItem closed indent2 picker-parent"></tr>
<tr class="divider MenuGroup"></tr>
</tbody>
</table>

我需要在具有类"divider"的第二个和第三个tr标记之间选择所有具有类"MenuItem"的tr标记。

从这个问题中,我大致了解如何使用以下通用语法按类选择标签:

//*[contains(concat(" ", normalize-space(@class), " "), " foo ")]

但我不确定如何将它与这个答案中提供的语法相结合。

示例:选择前面只有一个同级的所有"p"标记"分隔符"标签(

/*/p[count(preceding-sibling::divider)=1]

到目前为止我的尝试无效:

//*/tbody/tr[count(preceding-sibling::[contains(concat(" ", normalize-space(@class), " "), " divider")])=2]

让我们从XPath 3.1 开始

我需要选择类为MenuItem的所有tr标记,介于类为divider的第二个和第三个tr标记之间。

这是

/table/tbody/ (
let $dividers := tr[contains-token(@class, 'divider')] 
return tr[contains-token(@class, 'MenuItem'][. > > $dividers[2] 
and . < < $dividers[3]])

(我不得不在运算符< <> >中加一个空格,因为如果我在没有空格的情况下键入它们,它们就会变成V形(。

在XPath2.0中,这有点棘手,因为(a(您没有contains-token((函数,(b(没有"let";。为了解决缺少contains-token的问题,您必须使用可怕的contains(concat(" ", normalize-space(@class), " "), " divider"),就像您在示例中所做的那样。应对缺乏let更困难,但你确实有for,所以你可以做:

/table/tbody/ (
for $start := tr[contains-token(@class, 'divider')][2],
$end := tr[contains-token(@class, 'divider')][3]
return tr[contains-token(@class, 'MenuItem'][. > > $start 
and . < < $end])

(但扩展包含如上所述的令牌(

那么XPath1.0呢。这变得很棘手。基本上,您必须找到在开始节点的同级节点之后的节点,前提是它们也是结束节点的前同级节点。从概念上讲,这是($start/following-sibling::tr[...]) intersect $end/preceding-sibling[...],但在1.0中没有交集运算符,所以你必须使用等价的A intersect B可以写成A[count(.|B)=count(B)]。我将让您解决血腥的细节(或升级到更高版本的XPath…(

尝试:

//table//tr[@class="divider MenuGroup"]//following-sibling::tr[contains(@class,"MenuItem")]

请尝试这个-

//tr[@class='MenuGroup']//following-sibling::tr[@class="divider MenuGroup"]//following-sibling::tr[contains(@class,"MenuItem")]

最新更新