очень просто есть HTML-файл, и есть div с переменным id, подобным этому
<div id="abc_1"><div>
целочисленная часть идентификатора является переменной, поэтому она может быть abc_892, abc_553 … и т. д.
какой лучший запрос для этого?
//div[starts-with(@id, "abc_")]
В принятом в настоящее время ответе выбираются такие нежелательные элементы, как:
<div id="abc_xyz"/>
Но должны приниматься только такие элементы div , чей id начинается не только с "abc_" но и подстрока, следующая за _ представляет собой представление целого числа.
Используйте это выражение XPath :
//div [@id[starts-with(., 'abc_') and floor(substring-after(.,'_')) = number(substring-after(.,'_')) ] ]
Это выбирает любой элемент div , у которого есть атрибут id , строковое значение которого начинается со строки "abc_" и подстроки после того, как - является допустимым представлением целого числа.
Объяснение :
Здесь мы используем тот факт, что в XPath 1.0 это выражение XPath:
floor($x) = number($x)
оценивает значение true() точно, когда $x является целым числом.
Это можно легко проверить:
Если $x является целым числом, указанное выше выражение оценивается как true() по определению.
Если вышеприведенное выражение оценивается как true() , это означает, что ни одна из двух сторон равенства не является NaN , потому что по определению NaN не равно ни одному значению (включая себя). Но тогда это означает, что $x является числом ( number($x) isnt NaN ), и по определению число $x , равное целому floor($x) является целым числом.
Альтернативное решение :
//div [@id[starts-with(., 'abc_') and 'abc_' = translate(., '0123456789', '') ] ]