docs: function parse_xlml_data(xml, ss, data, cell/*:any*/, base, styles, csty, row, arrayf, o) {
  	var nf = "General", sid = cell.StyleID, S = {}; o = o || {};
  	var interiors = [];
  	var i = 0;
  	if(sid === undefined && row) sid = row.StyleID;
  	if(sid === undefined && csty) sid = csty.StyleID;
  	while(styles[sid] !== undefined) {
  		if(styles[sid].nf) nf = styles[sid].nf;
  		if(styles[sid].Interior) interiors.push(styles[sid].Interior);
  		if(!styles[sid].Parent) break;
  		sid = styles[sid].Parent;
  	}
  	switch(data.Type) {
  		case 'Boolean':
  			cell.t = 'b';
  			cell.v = parsexmlbool(xml);
  			break;
  		case 'String':
  			cell.t = 's'; cell.r = xlml_fixstr(unescapexml(xml));
  			cell.v = xml.indexOf("<") > -1 ? unescapexml(ss) : cell.r;
  			break;
  		case 'DateTime':
  			if(xml.slice(-1) != "Z") xml += "Z";
  			cell.v = (parseDate(xml) - new Date(Date.UTC(1899, 11, 30))) / (24 * 60 * 60 * 1000);
  			if(cell.v !== cell.v) cell.v = unescapexml(xml);
  			else if(cell.v<60) cell.v = cell.v -1;
  			if(!nf || nf == "General") nf = "yyyy-mm-dd";
  			/* falls through */
  		case 'Number':
  			if(cell.v === undefined) cell.v=+xml;
  			if(!cell.t) cell.t = 'n';
  			break;
  		case 'Error': cell.t = 'e'; cell.v = RBErr[xml]; if(o.cellText !== false) cell.w = xml; break;
  		default: cell.t = 's'; cell.v = xlml_fixstr(ss||xml); break;
  	}
  	safe_format_xlml(cell, nf, o);
  	if(o.cellFormula !== false) {
  		if(cell.Formula) {
  			var fstr = unescapexml(cell.Formula);
  			/* strictly speaking, the leading = is required but some writers omit */
  			if(fstr.charCodeAt(0) == 61 /* = */) fstr = fstr.slice(1);
  			cell.f = rc_to_a1(fstr, base);
  			delete cell.Formula;
  			if(cell.ArrayRange == "RC") cell.F = rc_to_a1("RC:RC", base);
  			else if(cell.ArrayRange) {
  				cell.F = rc_to_a1(cell.ArrayRange, base);
  				arrayf.push([safe_decode_range(cell.F), cell.F]);
  			}
  		} else {
  			for(i = 0; i < arrayf.length; ++i)
  				if(base.r >= arrayf[i][0].s.r && base.r <= arrayf[i][0].e.r)
  					if(base.c >= arrayf[i][0].s.c && base.c <= arrayf[i][0].e.c)
  						cell.F = arrayf[i][1];
  		}
  	}
  	if(o.cellStyles) {
  		interiors.forEach(function(x) {
  			if(!S.patternType && x.patternType) S.patternType = x.patternType;
  		});
  		cell.s = S;
  	}
  	if(cell.StyleID !== undefined) cell.ixfe = cell.StyleID;
  }