Как получить узлы с тем или иным значением с помощью XPATH - PullRequest
1 голос
/ 25 февраля 2012

У меня есть функция javascript, которая должна извлекать определенные узлы через xpath с помощью document.evaluate, до сих пор я использую что-то вроде

.//span[contains(@title, 'alerting')] | .//span[contains(@title, 'caution')]

Но она превращается в очень длинную строку, когда значения для сопоставленияБольше.Я не могу использовать [@title = word], потому что мне нужно получить элементы, атрибуты которых содержат некоторую строку.Я пробовал что-то вроде

.//span[contains(@title, ('alerting'|'caution'))]

Но ничего не получается.

Можете ли вы дать мне идею сократить первый синтаксис?

Ответы [ 4 ]

1 голос
/ 25 февраля 2012
.//span[contains(@title, ('alerting'|'caution'))]

Это недопустимый XPath - оператор объединения | может иметь только аргументы, которые являются наборами узлов, а не строками.

Используйте :

.//span[@title
          [contains(.,'alerting')
         or
           contains(.,'caution') 
          ]
        ]
1 голос
/ 25 февраля 2012

XPath должно быть так: -

.//span[contains(@title, 'alerting') or contains(@title, 'caution')]
1 голос
/ 25 февраля 2012

Почему бы просто не создать функцию, которая создает строку и построить выражение программно, и не беспокоиться об этом?Грубо говоря:

function spanContains(s) {
    return ".//span[contains(@title, '" + s + "')]";
}

var contains = [spanContains('word1'), spanContains('word2')].join("|");

Вы также можете попробовать использовать matches вместо contains, хотя я не уверен, какой это будет синтаксис JavaScript или если он поддерживается.

0 голосов
/ 25 февраля 2012

Вместо использования document.evaluate() вы можете использовать jquery, в этом случае вы можете сделать:

$('span').filter(function() { 
    var title = $(this).attr('title');
    return title != undefined && title.search(/(alerting|caution)/) != -1;
});
...