docs: function parse_comments_xml(data, opts) {
  	/* 18.7.6 CT_Comments */
  	if(data.match(/<(?:\w+:)?comments *\/>/)) return [];
  	var authors = [];
  	var commentList = [];
  	var authtag = data.match(/<(?:\w+:)?authors>([\s\S]*)<\/(?:\w+:)?authors>/);
  	if(authtag && authtag[1]) authtag[1].split(/<\/\w*:?author>/).forEach(function(x) {
  		if(x === "" || x.trim() === "") return;
  		var a = x.match(/<(?:\w+:)?author[^>]*>(.*)/);
  		if(a) authors.push(a[1]);
  	});
  	var cmnttag = data.match(/<(?:\w+:)?commentList>([\s\S]*)<\/(?:\w+:)?commentList>/);
  	if(cmnttag && cmnttag[1]) cmnttag[1].split(/<\/\w*:?comment>/).forEach(function(x) {
  		if(x === "" || x.trim() === "") return;
  		var cm = x.match(/<(?:\w+:)?comment[^>]*>/);
  		if(!cm) return;
  		var y = parsexmltag(cm[0]);
  		var comment = ({ author: y.authorId && authors[y.authorId] || "sheetjsghost", ref: y.ref, guid: y.guid });
  		var cell = decode_cell(y.ref);
  		if(opts.sheetRows && opts.sheetRows <= cell.r) return;
  		var textMatch = x.match(/<(?:\w+:)?text>([\s\S]*)<\/(?:\w+:)?text>/);
  		var rt = !!textMatch && !!textMatch[1] && parse_si(textMatch[1]) || {r:"",t:"",h:""};
  		comment.r = rt.r;
  		if(rt.r == "<t></t>") rt.t = rt.h = "";
  		comment.t = rt.t.replace(/\r\n/g,"\n").replace(/\r/g,"\n");
  		if(opts.cellHTML) comment.h = rt.h;
  		commentList.push(comment);
  	});
  	return commentList;
  }