Дано:Greasemonkey, XPath: найти все ссылки в строке таблицы
<tr>
<td><a href="http://foo.com">Keyword 1</a></td>
<td><a href="http://bar.com">Keyword 2</a></td>
<td><a href="http://wombat.com">Keyword 3</a></td>
</tr>
<tr>
<td><a href="http://blah.com">Keyword 4</a></td>
<td><a href="http://woof.com">Keyword 5</a></td>
<td><a href="http://miaow.com">Keyword 6</a></td>
</tr>
Мне нужно, чтобы соответствовать каждому URI в пределах ячеек таблицы. Ключевое слово согласовано во всем документе. Я могу соответствовать ссылкам для всего документа без проблем:
var links_in_document = document.evaluate(
"//a[starts-with(text(),'Keyword')]",
document,
null,
XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,
null);
Однако, даже если у меня есть простой способ для ссылки на узле TR, я не могу показаться, чтобы найти правильный XPath для получения ссылки в ряд. Ниже приведенный ниже фрагмент дает мне первое звено в первом ТД, но не все остальные. Помогите?
var links_in_row = document.evaluate(
".//a[starts-with(text(),'Keyword')]",
row,
null,
XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,
null);
(где «строка» - это контекстный узел).
Отредактировано: Возможно, я был неясно, я могу найти ссылки с уровня документа просто отлично. Я пытаюсь изолировать ссылки в одной строке, используя TR-узел в качестве контекста для XPath.
Редактировать: решение для интересов. У сломанной разметки, над которой я работал, не было атрибутов идентификатора, поэтому я добавил некоторые из них и смог продолжить. Отрывок:
var exhibit_link;
for(var i = 0; i < all_exhibit_links.snapshotLength; i++) {
exhibit_link = all_exhibit_links.snapshotItem(i);
// The rows have no unique ID, so we need to give them one.
// This will give the XPath something to 'latch onto'.
exhibit_link.parentNode.parentNode.id = 'ex_link_row_' + i.toString();
exhibit_link.addEventListener("click",
function(event) {
var row_id = event.target.parentNode.parentNode.id;
// Find only those links that are within rows with the corresponding id
var row_links = document.evaluate(
"id('" + row_id + "')/td/a[starts-with(text(),'Exhibit')]",
document,
null,
XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,
null);
// Open each link in a new tab
for(var j = 0; j < row_links.snapshotLength; j++) {
row_link = row_links.snapshotItem(j);
GM_openInTab(row_link.href);
}
// Suppress the original function of the link
event.stopPropagation();
event.preventDefault();
},
true);
}
Я получил тот же результат с тем же кодом, более или менее. Должно быть, что-то вне того, что было скопировано здесь. – anschauung
Отредактировано для уточнения: я могу найти их в контексте документа, но изолирование одной строки затруднительно. –