Ben Everard
Ben Everard

Reputation: 13804

XPath wildcards on node name

I want to grab a node from my XML file, the node has a prefix such as "latest_", but this may change and I'm keen for my XSLT to be as fluid as possible. Here's the XPath I want to use:

/data/stats/*_cost

This should match latest_cost, newest_cost, anything_cost, is there a way of doing this?

Cheers :-)

Upvotes: 51

Views: 105874

Answers (4)

user357812
user357812

Reputation:

This is the correct XPath 1.0 expression which selects an element with the last 5 character of name equal to "_cost" in any namespace.

/data/stats/*[substring(name(), string-length(name()) - 4) = '_cost']

Upvotes: 72

David W.
David W.

Reputation: 383

The above did not work for me. I had to "slightly" modify that as follows:

/data/stats/*[contains(name(),'_cost')]

Upvotes: 8

Alex Nikolaenkov
Alex Nikolaenkov

Reputation: 2545

With XPath 1.0 you can use /data/stats/*[substring-after(name(), '_cost') = ''] pattern. That checks if the element's name ends with the _cost suffix.

In XPath 2.0 there is fn:ends-with(str, str) and your corresponding expression will be *[ends-with(name(), '_cost')].

Upvotes: 10

redsquare
redsquare

Reputation: 78667

You could also use contains

e.g

/data/stats[contains(.,'_cost')] 

Upvotes: 8

Related Questions