我怎样才能得到相同rowspan的所有行下元素的XPATH ?



测试数据

<table>
<tbody>
<tr>
<td id="mainfield:1" rowspan="3">A1</td>
<td ><span class="searching_for_this"> AA1</span></td>
<td ><span class="not_searching_for_this">AA2</span></td>
</tr>
<tr>
<td ><span class="searching_for_this"> AA3 </span></td>
<td ><span class="not_searching_for_this">AA3 </span></td>
</tr>        
<tr>
<td ><span class="searching_for_this"> AA1 </span></td>
<td ><span class="not_searching_for_this">AA4 </span></td>
</tr>
<tr>
<td id="main_field:2" rowspan="3">B1</td>
<td ><span class="searching_for_this"> BB1</span></td>
<td ><span class="not_searching_for_this">BB2</span></td>
</tr>
<tr>
<td ><span class="searching_for_this"> AA1 </span></td>
<td ><span class="not_searching_for_this">BB3 </span></td>
</tr>        
<tr>
<td ><span class="searching_for_this"> BB2 </span></td>
<td ><span class="not_searching_for_this">BB3 </span></td>
</tr>
</tbody>
</table>

前提

  1. 我知道3rowspan所在行和列的内容,(在本例中为A1)
  2. 我现在要查找的类的一个元素的内容,在这种情况下AA1searching_for_this
  3. 我想在A1的rowspan下获得AA1的行(tr)。因此结果将是第一行和第三行

第一次尝试

那么在单行场景中,这将是像这样的:

  1. 主行://tr[td[contains(text(), 'A1')]]
  2. 从行中搜索子节点(相对搜索.//):.//tr[td/span[class=searching_for_this and contains(text(), 'AA1')]]

问题

在这个rowspan场景中,我不知道如何让所有元素都考虑到"下一行"colspan后不包括colspan外的行(B1)。

在最后一个答案之后,我试图从那里构建,但我仍然无法获得主行跨度行下的行来构建与主行的查询组合。这是我的尝试

$x("//tr[   (preceding-sibling::tr[ .//td[ contains(@id, 'main_field')]])[1][.//td[contains(text(),'A1')]]    ]")

我试图获得所有具有给定已知部分id的前兄弟姐妹trtr,使用[0](具有给定id的直接兄弟姐妹)的列表中的第一个,然后使用内容A1进行过滤。但我什么也没得到。

如果要在XPath 1.0中的单个表达式中完成此操作,则会变得有点复杂。你可以这样一点一点地构建它。

作为起点,以下是如何选择"主行"的方法:

//tr[td[contains(text(),'A1')]]

在此基础上,您可以在同一个rowspan中选择以下行:

//tr[td[contains(text(),'A1')]]
/following-sibling::tr[
position() < number(preceding-sibling::tr/td[contains(text(),'A1')]/@rowspan)
]

然而,这并不包括"主要row"本身。为了获得它,您可以使用联合运算符(|)对上述两个行进行联合,这样您就可以同时获得主行和属于同一rowspan的以下行:

(//tr[td[contains(text(),'A1')]]
|//tr[td[contains(text(),'A1')]]
/following-sibling::tr[
position() < number(preceding-sibling::tr/td[contains(text(),'A1')]/@rowspan)
]
)

现在您手头有了感兴趣的行集,您可以进一步缩小到您想要的行,例如:

(//tr[td[contains(text(),'A1')]]
|//tr[td[contains(text(),'A1')]]
/following-sibling::tr[
position() < number(preceding-sibling::tr/td[contains(text(),'A1')]/@rowspan)
]
)[td/span[@class='searching_for_this' and contains(text(), 'AA1')]]

最新更新