text: 
  /**
   * Module dependencies.
   */
  
  var Base = require('./base')
    , utils = require('../utils')
    , escape = utils.escape;
  
  /**
   * Save timer references to avoid Sinon interfering (see GH-237).
   */
  
  var Date = global.Date
    , setTimeout = global.setTimeout
    , setInterval = global.setInterval
    , clearTimeout = global.clearTimeout
    , clearInterval = global.clearInterval;
  
  /**
   * Expose `XUnit`.
   */
  
  exports = module.exports = XUnit;
  
  /**
   * Initialize a new `XUnit` reporter.
   *
   * @param {Runner} runner
   * @api public
   */
  
  function XUnit(runner) {
    Base.call(this, runner);
    var stats = this.stats
      , tests = []
      , self = this;
  
    runner.on('pass', function(test){
      tests.push(test);
    });
    
    runner.on('fail', function(test){
      tests.push(test);
    });
  
    runner.on('end', function(){
      console.log(tag('testsuite', {
          name: 'Mocha Tests'
        , tests: stats.tests
        , failures: stats.failures
        , errors: stats.failures
        , skip: stats.tests - stats.failures - stats.passes
        , timestamp: (new Date).toUTCString()
        , time: stats.duration / 1000
      }, false));
  
      tests.forEach(test);
      console.log('</testsuite>');    
    });
  }
  
  /**
   * Inherit from `Base.prototype`.
   */
  
  XUnit.prototype.__proto__ = Base.prototype;
  
  /**
   * Output tag for the given `test.`
   */
  
  function test(test) {
    var attrs = {
        classname: test.parent.fullTitle()
      , name: test.title
      , time: test.duration / 1000
    };
  
    if ('failed' == test.state) {
      var err = test.err;
      attrs.message = escape(err.message);
      console.log(tag('testcase', attrs, false, tag('failure', attrs, false, cdata(err.stack))));
    } else if (test.pending) {
      console.log(tag('testcase', attrs, false, tag('skipped', {}, true)));
    } else {
      console.log(tag('testcase', attrs, true) );
    }
  }
  
  /**
   * HTML tag helper.
   */
  
  function tag(name, attrs, close, content) {
    var end = close ? '/>' : '>'
      , pairs = []
      , tag;
  
    for (var key in attrs) {
      pairs.push(key + '="' + escape(attrs[key]) + '"');
    }
  
    tag = '<' + name + (pairs.length ? ' ' + pairs.join(' ') : '') + end;
    if (content) tag += content + '</' + name + end;
    return tag;
  }
  
  /**
   * Return cdata escaped CDATA `str`.
   */
  
  function cdata(str) {
    return '<![CDATA[' + escape(str) + ']]>';
  }
  