XPath выбор нескольких элементов с предикатами - PullRequest
11 голосов
/ 02 ноября 2010

У меня есть запрос XPath, который делает то, что я хочу, а именно, выбирая объединение «фамилия» и «данные-имена» с данными предикатами (это на самом деле либо / или мне нужно, но объединение работает нормально):

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

Однако мне это кажется слишком скучным, и я чувствую, что можно сделать что-то более лаконичное, например:

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

... но эта версия недействительна XPath.

Может кто-нибудь рассказать мне о более аккуратном способе написания оригинального выражения XPath, в котором не требуется писать полный путь дважды?

Спасибо

Richard

Ответы [ 3 ]

26 голосов
/ 02 ноября 2010

Во-первых, это действительный XPath 2.0:

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

Во-вторых, это XPath 1.0:

/header/authors/*[self::surname|self::given-names][text()][@id='1'] 
4 голосов
/ 02 ноября 2010

Как насчет

/header/authors/*[(name() = "surname" or name()="given-names") and ./text() and @id='1'] 
2 голосов
/ 02 ноября 2010

В дополнение к хорошим ответам Алехандро и Севы есть еще один вариант:

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

Это действительно в XPath 1.0.Это все еще немного избыточно, но более кратко, чем длинная версия в вашем вопросе.

Еще одна альтернатива - объявить переменную для элементов фамилии и переменную для элементов данного имени, а затем

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

В целом это, вероятно, будет длиннее, но легче читать, чем выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...