Regex в xpath? - PullRequest
       24

Regex в xpath?

1 голос
/ 02 ноября 2011

Я хочу найти ячейку таблицы, которая содержит ссылку (\d{0,3} )?pieces.

Как мне написать этот xpath?

Могу ли я просто вставить xpath непосредственно в поиск Capybara? Или мне нужно сделать что-то особенное, чтобы указать, что это регулярное выражение? Или я вообще не могу этого сделать?

Ответы [ 2 ]

2 голосов
/ 02 ноября 2011

Xpath 1.0

XPath 1.0 не включает поддержку регулярных выражений. Вы должны быть в состоянии достичь желаемого соответствия с помощью следующего выражения:

//td/a['pieces'=substring(@href, string-length(@href) - 
                                 string-length('pieces') + 1) and 
       'pieces'=translate(@href, '0123456789', '') and 
        string-length(@href) > 5 and 
        string-length(@href) < 10]

Первый тест в предикате проверяет, что строка заканчивается на pieces. Второй тест гарантирует, что вся строка равна pieces, когда все цифры удалены (то есть нет других символов). Последние два теста гарантируют, что вся длина строки составляет от 6 до 9, что составляет длину pieces плюс ноль-три цифры.

Проверьте это на следующем документе:

<table>
    <tr>
        <td><a href="444pieces">test0</a></td>
        <td>no match</td>
        <td>no match</td>
        <td><a href="123pieces">test1</a></td>
        <td><a href="12pieces">test2</a></td>
        <td><a href="1232pieces">no match</a></td>
        <td><a href="pieces">test3</a></td>
    </tr>
</table>

Он должен соответствовать только ссылкам test0, test1, test2 и test3.

(Примечание. Выражение может быть еще более усложнено возможностью появления других символов, предшествующих той части, которую вы пытаетесь сопоставить.)

XPath 2.0

Достижение этого в XPath 2.0 тривиально с функцией matches .

0 голосов
/ 04 ноября 2011

// td / a [substring-after (concat (@href, 'x'), 'куски') = 'x' и 111> = concat (0, перевод (substring-before (@href, 'куски)'),' 0123456789 -. ',' 1111111111xxx '))]

Это еще одно решение, не обязательно лучшее, но, возможно, интересное.

Первый конъюнкт верен именно тогда, когда @href содержит ровно одно вхождение 'кусков', и это в конце.Второй конъюнкт истинен только тогда, когда часть @href перед «кусочками» пуста или является цифрой, состоящей исключительно из цифр (№, - или пробела), не более 3 цифр.Число «1» в «111> =» - это максимальное количество совпадающих цифр.

Ссылка: http://www.w3.org/TR/xpath

  • Функция substring-after возвращаетподстрока первой строки аргумента, которая следует за первым появлением второй строки аргумента в первой строке аргумента, или пустая строка, если строка первого аргумента не содержит строку второго аргумента.

  • Функция substring-before возвращает подстроку первой строки аргумента, которая предшествует первому вхождению второй строки аргумента в первой строке аргумента, или пустую строку, если строка первого аргументане содержит строку второго аргумента.

  • ... строка, состоящая из необязательного пробела, за которым следует необязательный знак минуса, за которым следует число, за которым следует пробел, преобразуется в число IEEE 754 ... любая другая строка преобразуетсяв NaN

  • Number :: = Digits ('.' Digits?)?|''Цифры

  • У узла атрибута есть строковое значение.Строковое значение - это нормализованное значение, как указано в Рекомендации XML [XML]

  • Функция normalize-space возвращает строку аргумента с пробелами, нормализованными путем удаления начальных и конечных пробелов и замены последовательностейпробельных символов одним пробелом.

...