# File tailor.rb, line 42
  def process

    # process imports
    process_import(@xml_document, TOPLEVEL_BINDING)

    # process each loops
    loops = REXML::XPath.match(@xml_document, '//*[@each]')
    loops.reverse!  # reverse loops to do inner nested loops first
    loops.each do |element|
      #
      new_element_string = ''
      element.write(new_element_string)
      #
      loop_each = element.attributes['each']
      if element.attributes.has_key?('do')
        loop_do = element.attributes['do']
      else
        loop_do = 'item'
      end
      # collect bindings
      indexer = "#{loop_do.split(',')[0]}_index"
      loop_eval = "i = -1 \n"
      loop_eval += "#{loop_each}.collect do |#{loop_do}| \n"
      loop_eval += "  #{indexer} = i += 1 \n"
      loop_eval += "  binding \n"
      loop_eval += "end \n"
      loop_bindings = eval(loop_eval.untaint, TOPLEVEL_BINDING)
      loop_bindings.each do |loop_binding|  # for each binding substitute items
        # make new element
        new_element_source = REXML::SourceFactory.create_from(new_element_string)
        new_element = REXML::Element.new(new_element_source)
        new_element.attributes.get_attribute('each').remove
        new_element.attributes.get_attribute('do').remove if element.attributes.has_key?('do')
        # process items
        process_eval(new_element.untaint, loop_binding)
        process_if(new_element, loop_binding)
        process_content(new_element, loop_binding)
        process_attributes_if(new_element, loop_binding)
        process_attributes(new_element, loop_binding)
        # insert the new element
        element.parent.insert_before(element, new_element)
      end
      element.remove
    end
    
    # those not contained in each loops
    process_eval(@xml_document, TOPLEVEL_BINDING)
    process_if(@xml_document, TOPLEVEL_BINDING)
    process_content(@xml_document, TOPLEVEL_BINDING)
    process_attributes_if(@xml_document, TOPLEVEL_BINDING)
    process_attributes(@xml_document, TOPLEVEL_BINDING)

  end