# a possible solution to http://www.ruby-forum.com/topic/201997
require 'rexml/document'
require 'rexml/formatters/pretty'
puts "Ruby version is #{RUBY_VERSION}" , String.new
xml_from = REXML::Document.new(DATA) # pull input from data at the end of this file
xml_to = REXML::Document.new
# REXML::Element's hash values aren't consistent, so assign hash based on text
# and populate with array containing the column
columns = Hash.new do |hash,column|
hash.fetch(column.text) { hash[column.text] = [column] }
end
# extract data from xml_from
xml_from.root.each_element do |row|
columns[ row.elements[1] ] << row.elements[2] # key is first column, value is array of all columns
end
# insert data into xml_to
xml_to.add_element 'rows'
columns.each do |first_column_text,columns|
row = REXML::Element.new 'row' # gives us <row> ... </row>
columns.each { |column| row.add_element(column) } # places the columsn into the row
xml_to.root.add_element row
end
# weird and hacky, but can't figure out how else to get this to output for humans
REXML::Formatters::Pretty.new.send 'write_document' , xml_to , STDOUT
__END__
<rows>
<row>
<column>Business Strategy</column>
<column>bus1</column>
</row>
<row>
<column>Company Description</column>
<column>tar1</column>
</row>
<row>
<column>Business Strategy</column>
<column>bus2</column>
</row>
<row>
<column>Company Description</column>
<column>tar2</column>
</row>
<row>
<column>Business Strategy</column>
<column>bus3</column>
</row>
<row>
<column>Company Description</column>
<column>tar3</column>
</row>
</rows>