I have actually found a solution and it's as horrible as you'd think:
<xsl:variable name='inner'
select='document(concat("data:text/html;charset=UTF-8,<body>",atom:content,"</body>"))'/>
<xsl:apply-templates select='$inner/body/*'/>
So basically what I do is turn the atom feed content into data: uri and apply my templates to it. This is a bit fragile, since some of the special templates may apply still; the solution, if this is ever an issue, will be to specify different modes based on whether we're processing inner or outer data.
This is also a very good detector of broken XML pages, since they fail to parse and don't appear 8-)