2009-07-03 2 views
1

Дано: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); 
} 

ответ

3

быстрый тест в JavaScript Shell с вашим HTML, например, и следующий код:

var links_in_row = document.evaluate(".//a[starts-with(text(),'Keyword')]" 
      , document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null); 
var i = 0; 
while((link = links_in_row.snapshotItem(i)) != null) { 
    print(link.innerHTML);i++; 
} 

печатает:

Keyword 1 
Keyword 2 
Keyword 3 

, который предполагает, что это работает правильно. Только изменения я сделал не начать на уровне строк, но в документе ...

+0

Я получил тот же результат с тем же кодом, более или менее. Должно быть, что-то вне того, что было скопировано здесь. – anschauung

+0

Отредактировано для уточнения: я могу найти их в контексте документа, но изолирование одной строки затруднительно. –

0

Try:

descendant::*[self::a[starts-with(text(), 'Keyword')]]
1

Расширение на то, что Берт написал, что это работает для меня.

var rows = document.evaluate("//tr" 
      , document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null); 
var i = 0; 
while((row = rows.snapshotItem(i)) != null) { 
    print('NEW ROW----'); 
    var links = document.evaluate(".//a[starts-with(text(),'Keyword')]", 
            row, null, 
            XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null); 
    var k = 0; 
    while ((link = links.snapshotItem(k)) != null) { 
     print(link.innerHTML); 
     k++; 
    } 
    i++; 
} 

Печатает:

NEW ROW---- 
Keyword 1 
Keyword 2 
Keyword 3 
NEW ROW---- 
Keyword 4 
Keyword 5 
Keyword 6 

Я думаю, что есть что-то не хватает за пределами того, что было копировать вставить.

bert должен получить ответ для этого IMHO.

Смежные вопросы