Вот один из способов сделать это в Нокогири - могут быть и другие, более эффективные, так как в конечном итоге вы обходите весь DOM.
require 'set'
#Using a set here to make lookup O(1), because we don't care about the initial order
id_set = ['bar', 'para-3', 'para-2', 'para-7'].to_set
sorted = []
value.root.traverse do |node|
node_id = node['id']
sorted << node_id if node_id && id_set.delete?(node_id)
end
# sorted is now ['para-2', 'para-3', 'bar', 'para-7']
РЕДАКТИРОВАТЬ: Вот одна строка, которая дает те же результаты, но я не сделал сравнительный анализ, чтобы увидеть, что быстрее.
ids = ['bar', 'para-3', 'para-2', 'para-7']
value.xpath("//*[@id]").collect {|node| node['id']} & ids