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 ne
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.