我需要一个XPath表达式,它计算具有起始类属性字符串的所有<tr>
行:room_loop_counter
按其属性名称本身分组。
我有以下示例HTML代码从中提取数据:
<tbody id="container" >
<tr class="room_loop_counter1 maintr">
<td class="legibility " rowspan="6"></td>
<td colspan="4" style="padding:0;"></td>
</tr>
<tr class="room_loop_counter1">
<td ></td>
<td class=""></td>
</tr>
<tr class="room_loop_counter1"></tr>
<tr class="room_loop_counter2 maintr divider"></tr>
<tr class="room_loop_counter2"></tr>
<tr class="room_loop_counter3 maintr divider"></tr>
<tr class="room_loop_counter3"></tr>
<tr class="room_loop_counter3"></tr>
<tr class="room_loop_counter3"></tr>
<tr class="room_loop_counter3"></tr>
</tbody>
鉴于上述HTML,我希望获得结果: 2,1,4 。 计数是元素的数量减去1,因为我想从计数中丢弃第一个<tr>
(maintr
的那个)作为标题...
在<tr>
元素之间可能存在其他<tr>
元素,因此它们并非严格依次,因此我们不能依赖于后续或前面的兄弟逻辑。
我已尝试使用以下XPath表达式:
count(//table[@id="maxotel_rooms"]/tbody/tr[@class=distinct-values(//table[@id="maxotel_rooms"]/tbody/tr[starts-with(@class, "room_loop_counter") and not(contains(@class, "maintr"))]/@class)]/@class])
但它并不适用于chrome(在控制台窗口上使用$x('')
进行评估),因为它无法识别distinct-values
函数。
你能建议一个可能的解决方案?什么是最好的方法?
答案 0 :(得分:1)
检查此XPath是否有唯一的tr,其中类开头是一些数据,而不是其他类名。
// tbody / tr [starts-with(@class,“room_loop_counter”)而不是(包含(@class,“maintr”))] / following :: tr [not(./@ class = following :: tr / @ class)而不是(contains(@class,“maintr”))]
使用Javascript:
var path = "//body/div";
var uniquePathCount = window.document.evaluate('count(' + path + ')', window.document, null, 0, null);
console.log( uniquePathCount );
console.log( uniquePathCount.numberValue );
输出继电器:
<tr class="room_loop_counter1"/>
<tr class="room_loop_counter2"/>
<tr class="room_loop_counter3"/>