очень просто есть 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', '') ] ]