diff --git a/theme/views-data-export-xml-body.tpl.php b/theme/views-data-export-xml-body.tpl.php
index b97e8ad..698bb08 100644
--- a/theme/views-data-export-xml-body.tpl.php
+++ b/theme/views-data-export-xml-body.tpl.php
@@ -14,7 +14,15 @@
 <?php foreach ($themed_rows as $count => $row): ?>
   <<?php print $item_node; ?>>
 <?php foreach ($row as $field => $content): ?>
+  <?php if (in_array($field, $multiple_fields) && count($content) > 1): ?>
+    <<?php print $xml_tag[$field]; ?>>
+    <?php foreach ($content as $field_content): ?>
+      <<?php print $xml_item_tag; ?>><?php print $field_content; ?></<?php print $xml_item_tag; ?>>
+    <?php endforeach; ?>
+    </<?php print $xml_tag[$field]; ?>>
+  <?php else: ?>
     <<?php print $xml_tag[$field]; ?>><?php print $content; ?></<?php print $xml_tag[$field]; ?>>
+  <?php endif; ?>
 <?php endforeach; ?>
   </<?php print $item_node; ?>>
 <?php endforeach; ?>
diff --git a/theme/views_data_export.theme.inc b/theme/views_data_export.theme.inc
index 1a4f7d3..0e191e1 100644
--- a/theme/views_data_export.theme.inc
+++ b/theme/views_data_export.theme.inc
@@ -376,22 +376,41 @@ function template_preprocess_views_data_export_xml_body(&$vars) {
   // Compute the tag name based on the views base table, minus any trailing 's'.
   $vars['item_node'] = _views_data_export_xml_tag_clean(rtrim($vars['view']->base_table, 's'));
 
+  // Keep track of fields that contain multiple values
+  $vars['multiple_fields'] = array();
+
   foreach ($vars['themed_rows'] as $num => $row) {
     foreach ($row as $field => $content) {
-      // Prevent double encoding of the ampersand. Look for the entities produced by check_plain().
-      $content = preg_replace('/&(?!(amp|quot|#039|lt|gt);)/', '&amp;', $content);
-      // Convert < and > to HTML entities.
-      $content = str_replace(
-        array('<', '>'),
-        array('&lt;', '&gt;'),
-        $content);
-      $vars['themed_rows'][$num][$field] = $content;
+      // Treat multi-valued fields differently in XML
+      $views_field_name = 'field_' . $field;
+
+      if (isset($vars['view']->result[$num]->$views_field_name)
+          && is_array($vars['view']->result[$num]->$views_field_name)
+          && count($vars['view']->result[$num]->$views_field_name) > 1) {
+        // Mark field as multiple if not already marked
+        if (!array_search($field, $vars['multiple_fields'])) {
+          $vars['multiple_fields'][] = $field;
+        }
+        $vars['themed_rows'][$num][$field] = array();
+        foreach ($vars['view']->result[$num]->$views_field_name as $field_num => $field_content) {
+          $vars['themed_rows'][$num][$field][$field_num] = $field_content['rendered']['#markup'];
+        }
+      }
+
+      // Cleanup all content contained in each field
+      if (is_array($vars['themed_rows'][$num][$field])) {
+        array_walk($vars['themed_rows'][$num][$field], '_views_data_export_xml_content_clean');
+      }
+      else {
+        $vars['themed_rows'][$num][$field] = _views_data_export_xml_content_clean($content);
+      }
     }
   }
 
   foreach ($vars['header'] as $field => $header) {
     // If there is no field label, use 'no name'.
     $vars['xml_tag'][$field] = !empty($header) ? $header : 'no name';
+    $vars['xml_item_tag'] = t('item');
     if ($vars['options']['transform']) {
       switch ($vars['options']['transform_type']) {
         case 'dash':
@@ -407,6 +426,7 @@ function template_preprocess_views_data_export_xml_body(&$vars) {
           break;
         case 'pascal':
           $vars['xml_tag'][$field] = str_replace(' ', '', ucwords(strtolower($header)));
+          $vars['xml_item_tag'] = drupal_ucfirst(t('item'));
           break;
       }
     }
@@ -442,6 +462,25 @@ function _views_data_export_xml_tag_clean($tag) {
 }
 
 /**
+ * Returns valid XML content formed from the given input.
+ *
+ * @param $content The string that should be made into valid XML content.
+ * @return The valid XML tag or an empty string if the string contained no valid
+ * XML tag characters.
+ */
+function _views_data_export_xml_content_clean($content) {
+  // Prevent double encoding of the ampersand. Look for the entities produced by check_plain().
+  $content = preg_replace('/&(?!(amp|quot|#039|lt|gt);)/', '&amp;', $content);
+  // Convert < and > to HTML entities.
+  $content = str_replace(
+    array('<', '>'),
+    array('&lt;', '&gt;'),
+    $content);
+
+  return $content;
+}
+
+/**
  * Shared helper function for export preprocess functions.
  */
 function _views_data_export_header_shared_preprocess(&$vars) {
