Могу ли я использовать регулярное выражение в выражении XPath?
Вопрос
Что -то вроде .//div[@id='foo\d+]
для захвата тегов div с помощью id='foo123'
.
Я использую.СЕТЬ, если это имеет значение.
Решение
Как отмечалось в других ответах, XPath 1.0 не поддерживает регулярные выражения.
Тем не менее, у вас есть следующие варианты:
- Используйте выражение XPath 1.0 (обратите внимание на
starts-with()
иtranslate()
функции), подобные этому:
.//div [starts-with(@id, 'foo') and 'foo' = translate(@id, '0123456789', '') and string-length(@id) > 3 ]
Использование EXSLT.NET -- есть способ используйте его функции непосредственно в выражениях XPath без необходимости использовать XSLT.Функциями расширения EXSLT, которые позволяют использовать регулярные выражения, являются:
regexp:match()
,regexp:replace()
иregexp:test()
Использование XPath 2.0/XSLT 2.0 и его встроенная поддержка регулярных выражений (функции совпадения (), заменить() и токенизировать())
Другие советы
XPath 2.0 имеет некоторые функции, которые поддерживают регулярные выражения: matches()
, replace()
, tokenize()
.
В XPath 1.0 нет поддержки регулярных выражений.
Для .NET вы можете использовать движок XPath на Saxon.Net для поддержки XPath 2.0.
Итак, если использовать движок XPath 2.0 в Saxon.NET, ваш пример превратится в: .//div[matches(@id,'foo\d+')]
.
В .NET у вас есть возможность получить доступ к вашим пользовательским классам (и, следовательно, к регулярному выражению, если вы можете закодировать его соответствующим образом для ваших нужд) через объекты расширения.
Учебник здесь.
Я тоже хотел это сделать, поэтому создал свой собственный basic модуль xpath.