Запрос xpath с регулярным выражением

очень просто есть 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 является целым числом.

Это можно легко проверить:

  1. Если $x является целым числом, указанное выше выражение оценивается как true() по определению.

  2. Если вышеприведенное выражение оценивается как true() , это означает, что ни одна из двух сторон равенства не является NaN , потому что по определению NaN не равно ни одному значению (включая себя). Но тогда это означает, что $x является числом ( number($x) isnt NaN ), и по определению число $x , равное целому floor($x) является целым числом.

Альтернативное решение :

 //div [@id[starts-with(., 'abc_') and 'abc_' = translate(., '0123456789', '') ] ]