Используете ли вы XPath 1.0 или 2.0? max
- это XPath 2.0, не так ли? И часто реализации XPath 2.0 также поддерживают XQuery 1.0, так что вы можете просто сделать
let $max-price := max(/inventory/book/price)
return /inventory/book[price = $max-price]
чтобы получить те или иные элементы книги, имеющие максимальную цену.
Если вам нужно использовать чистый XPath 2.0, тогда, конечно,
/inventory/book[price = max(../book/price)]
следует сделать, это может быть неэффективно.
Что касается вашего второго вопроса,
/inventory/book[price > preceding-sibling::book[1]/price]
делай что хочешь?