/**
  * sort children of $node, identified by $child_id_attribute
  * this is done because the simplexml iterator can't be swap-sorted
  *
  * @param simplexmlelement   $to_node          node to sort children of
  * @param simplexmlelement   $from_node        children element name to sort
  * @param boolean            $copy_attributes  should the attributes of from_node be copied to to_node
  *
  * @return void
  */
 protected static function file_sort_children_node_merge(&$to_node, &$from_node, $copy_attributes = TRUE)
 {
     // merge 'from' attributes onto 'to' node
     if ($copy_attributes) {
         foreach ($from_node->attributes() as $attr_key => $attr_value) {
             $to_node->addAttribute($attr_key, $attr_value);
         }
     }
     foreach ($from_node->children() as $simplexml_child) {
         $simplexml_temp = $to_node->addChild($simplexml_child->getName(), self::ampersand_magic($simplexml_child));
         foreach ($simplexml_child->attributes() as $attr_key => $attr_value) {
             $simplexml_temp->addAttribute($attr_key, $attr_value);
         }
         self::file_sort_children_node_merge($simplexml_temp, $simplexml_child, FALSE);
     }
 }