Jonathan
Jonathan

Reputation: 2880

use xpath function ends-with() to find digit

I would like to loop and find elements starting with a string and ends with a digit but I'm not sure how to do it with ends-with()

I have this code here

*[starts-with(name(), 'cup') and ends-with(name(), '_number')]

ps: not sure what version of xpath the application is using

Upvotes: 2

Views: 4024

Answers (2)

kjhughes
kjhughes

Reputation: 111541

XPath 2.0

This is straight-forward in XPath 2.0, where this expression,

//*[matches(name(), '^cup.*\d$')]

will select all elements whose name starts with cup and ends with a digit, as requested.

XPath 1.0

Since XPath 1.0 lacks regex, ends-with(), and functions to test if a string is a numbers, your request gets to be more complicated with XPath 1.0. Here's one possible working solution:

//*[starts-with(name(), 'cup') 
    and number(substring(name(),string-length(name()))) 
      = number(substring(name(),string-length(name())))]

Note that the second clause is a clever way by Dimitre Novatchev to test in XPath 1.0 whether a string is a number.

Here's a shorter way to check for ending in a digit in XPath 1.0:

//*[starts-with(name(), 'cup') 
    and not(translate(substring(name(),string-length(name())), '0123456789', ''))]

Upvotes: 2

SomeDude
SomeDude

Reputation: 14228

I believe ends-with is not in Xpath 1.0 , you must be using atleast XPath 2.0 , then you can use matches() to match string with digit at end like:

matches(name(), '.*\d+$')

`then xpath will be :

*[starts-with(name(), 'cup') and matches(name(), '.*\d+$')] or just like as @kjhughes mentioned in his answer :

*[matches(name(), '^cup.*\d+$')]

Upvotes: 1

Related Questions