require 'rexml/document' include REXML doc = Document.new(File.open('edinburgh_business.xml','r')) raw_grps = doc.root.elements.to_a('records/listing/records/business').group_by do |b| REXML::Text::unnormalize(b.elements['summary/category/text()'].to_s) end gbusiness = raw_grps.map do |category, businesses| summary = "<name>%s</name><business_no>%s</business_no>" % [category, businesses.length] a = [summary, businesses.join("\n")] "<category><summary>%s</summary><records>%s</records></category>" % a end buffer = "<categories><summary/><records>%s</records></categories>" % gbusiness.join("\n") File.open('business_categories_group_edinburgh.xml','w'){|f| Document.new(buffer).write f}
Here's a screenshot as it appears in the web browser [twitxr.com]