测试数据
<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>
前提
- 我知道
3
rowspan所在行和列的内容,(在本例中为A1
) - 我现在要查找的类的一个元素的内容,在这种情况下
AA1
和searching_for_this
- 我想在
A1
的rowspan下获得AA1
的行(tr)。因此结果将是第一行和第三行
第一次尝试
那么在单行场景中,这将是像这样的:
- 主行:
//tr[td[contains(text(), 'A1')]]
- 从行中搜索子节点(相对搜索
.//
):.//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的前兄弟姐妹tr
的tr
,使用[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')]]