Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

XPath selecting multiple elements with predicates

Tags:

xslt

xpath

I have an XPath query which is doing what I want, namely selecting a union of 'surname' & 'given-names' with the given predicates (It's actually either/or that I need, but the union works fine):

/header/authors/surname[./text() and @id='1']
|
/header/authors/given-names[./text() and @id='1']

However this seems overly long-winded to me and I feel that it should be possible to do something more succinct such as:

/header/authors/(surname|given-names)[./text() and @id='1']

... but this version is not valid XPath.

Can anyone tell me of a neater way of writing the original XPath expression which doesn't require the full path to be written twice?

Thanks

Richard

like image 573
Richard Corfield Avatar asked Nov 02 '10 16:11

Richard Corfield


1 Answers

In addition to Alejandro's and Seva's good answers, another alternative is

(/header/authors/surname | /header/authors/given-names)[text() and @id='1']

This is valid in XPath 1.0. It still is a bit redundant, but is more succinct than the long-winded version in your question.

A further alternative would be to declare a variable for surname elements and a variable for given-name elements, and then

($surnames | $given-names)[text() and @id='1']

That would probably be longer in total, but easier to read than the above.

like image 133
LarsH Avatar answered Sep 30 '22 16:09

LarsH