Для выражений «И» вы более или менее застряли с тем, что у вас есть. Хотя я бы написал это так:
//*/foo[bar/text()='a' and bar/text()='c']
Для выражений "ИЛИ" (ваш вопрос по этому вопросу не ясен) вы можете попробовать:
//*/foo[bar[contains(',a,c,', concat(',', text(), ','))]]
Или, более читабельно написано:
//*/foo[
bar[
contains(
',a,c,',
concat(',', text(), ',')
)
]
]
Находит <foo>
элементов, которые содержат <bar>
элементов, которые сами соответствуют определенному правилу. И правило таково: «текстовое значение (заключенное в запятые) содержится в строке поиска (заключенное в запятые)».
Для текстового значения 'a'
и строки поиска 'a,b'
вы должны искать ',a,'
в ',a,b,'
. Поэтому, если какой-либо из внутренних элементов <bar>
совпадает, будет выбран внешний элемент <foo>
.
Вы должны будете выбрать разделитель, который не может содержаться в значениях, очевидно. Из вашего примера кода я выбрал ','
, но подойдет любой действительный символ.