Найти все <a>s, кто указывает на изображение с XPath 1.0 - PullRequest
0 голосов
/ 17 марта 2010

Во-первых, я могу предположить, что все URL-адреса, заканчивающиеся на jpeg, jpg, bmp, png или gif, являются изображениями, а другие - нет.

Я подумал и попробовал два решения:

  • Соответствие регулярному выражению. (Jpe? G | bmp | png | gif) $
  • Использование конца-с для проверки каждого отдельно

Но, похоже, ни один из них не существует в XPath 1.0, или, по крайней мере, они не существуют в Firefox (я пишу скрипт greasemonkey, поэтому он важен только для пути работы в Firefox). 1011 *

Извините за заголовок, ТАК не думал, что "Найти все ссылки на изображения в XPath 1.0" было достаточно уникальным

Ответы [ 4 ]

3 голосов
/ 17 марта 2010

Хотя вы запрашиваете решение для XPath, альтернативным подходом было бы использовать что-то вроде jQuery или Prototype, который использует селекторы CSS для выбора элементов.

Например, с помощью jQuery вы можете использовать:

$("a[href$='jpg'],a[href$='gif'],a[href$='png']").each(functionOfChoice);
2 голосов
/ 17 марта 2010

В XPath 1.0 нет регулярных выражений, и нет ни ends-with().

URL не могут содержать пробелы, не становясь недействительными, поэтому вы можете использовать их для достижения соответствия конца строки. Вы могли бы сделать это:

//a[
  contains(concat(@href, ' '), '.jpg ' or
  contains(concat(@href, ' '), '.bmp ' or
  contains(concat(@href, ' '), '.png '
]

или это (как предлагает @AakashM):

//a[
  substring(@href, string-length(@href) - 2, 3) = 'jpg' or
  substring(@href, string-length(@href) - 2, 3) = 'bmp' or
  substring(@href, string-length(@href) - 2, 3) = 'png'
]

Я думаю, что последний вариант будет работать немного лучше, в то время как первый вариант короче и на него будет приятнее смотреть Зависит от того, нужна ли вам здесь производительность.

2 голосов
/ 17 марта 2010

Вы можете использовать комбинацию substring и string-length (обе из которых равны в XPath 1.0) для имитации ends-with. Это не красиво, но работает:

substring(@href, string-length(@href) - 3 + 1, 3) = 'jpg'

(здесь 3 s - длина jpg; 1 предназначен для индексации substring на основе 1)

должно иметь то же значение истинности, что и

ends-with(@href, 'jpg')

Из вашего вопроса я предполагаю, что вы знаете, как проверить каждое возможное расширение отдельно.

0 голосов
/ 17 марта 2010

Это будет сложно, поскольку в XPath нет функции end-with (), которую вам необходимо использовать для проверки конца атрибута HREF для соответствующих расширений файлов. Вам придется прибегнуть к использованию substring-after().

Это не будет красиво, что-то вроде ...

fn:substring-after(a[@href], '.') = 'jpg'

РЕДАКТИРОВАТЬ : Похоже, что substring-after является не частью XPath 1.0 , поэтому вам придется использовать даже более уродливый substring и string-length

...