Мы хотим, чтобы элемент "attribute" @name 'Author' следовал за элементом "attribute" из @name 'Title' со значением 'Book n', без каких-либо других элементов "attribute" из @name ' Заголовок «между ними (потому что, если есть, то автор является автором какой-то другой книги).
Иначе говоря, это означает, что мы хотим, чтобы автор, которого first предшествующий заголовок (тот, которому он "принадлежит"), является тем, которого мы ищем:
//attribute[@name='Author']
[preceding-sibling::attribute[@name='Title'][1][contains(.,'Book N')]]
N = C => находит <attribute name="Author"><value>James Berry</value></attribute>
N = B => ничего не находит
Использование ключей и / или группирующих функций, доступных в XSLT 2.0, упростит эту задачу (и намного быстрее, если файл большой).
(парсер кода SO, кажется, думает, что «//» означает «комментарии», но в XPath это не так! Sigh.)