Here is our version. Browsers data are sorted alphabetically per month. I couldn't figure out how to include missing data so that the last segment wasn't filled.
CreateRow[XMLElement["month", _, data_], browsers_] :=
Module[{browserattrib, info, browsername, share, month, label, rules, output},
browserattrib = Cases[data, XMLElement["browser", attrib_, _] :> attrib];
share = "share" /. browserattrib;
browsername = "name" /. browserattrib;
month = "month" /. browserattrib;
label = MapThread[StringJoin[#1, "\n", #2, ": ", ToString[100*ToExpression[#3]], "%"] &,
{month, browsername, share}];
rules = MapThread[(#3 -> Legended[Tooltip[ToExpression@#1, #2], #3] &), {share, label, browsername}];
output = (# -> If[(# /. rules) === #, Missing[], (# /. rules)]) & /@ browsers;
Last /@ output];
CreateArray[xml_] := Module[{browsers, months},
browsers = Union["name" /.Cases[xml, XMLElement["browser", attrib_, _] :> attrib, Infinity]];
months = Reverse@Cases[xml, XMLElement["month", _, _], Infinity];
CreateRow[#, browsers] & /@ months];
PieChart[CreateArray@Import["http://www.michaelvandaniker.com/labs/browserVisualization/\
srcview/source/data/browser_stats.xml.txt", "XML"],
SectorOrigin -> {{Pi/2, -1}, 10}, SectorSpacing -> None,
ImageSize -> 800, ChartStyle -> 54,
Epilog -> {Inset["January 2002", Center],
Inset["August 2009", Scaled[{.5, .92}]]}]