Here is an XSLT 2.0 stylesheet you can use with Saxon 9 or any other XSLT 2.0 processor. Note that it includes the stylesheet
http://www.dcarlisle.demon.co.uk/htmlparse.xsl, written by David Carlisle, to parse the escaped HTML (e.g. <br> elements).
Code:
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:d="data:,dpc"
exclude-result-prefixes="d"
version="2.0">
<xsl:output method="xml" indent="yes"/>
<xsl:include href="http://www.dcarlisle.demon.co.uk/htmlparse.xsl"/>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="td">
<xsl:variable name="phtml">
<xsl:apply-templates mode="parse"/>
</xsl:variable>
<xsl:copy>
<xsl:for-each-group select="$phtml/node()" group-ending-with="br">
<Para>
<xsl:copy-of select="current-group()[not(self::br)]"/>
</Para>
</xsl:for-each-group>
</xsl:copy>
</xsl:template>
<xsl:template match="a[@name]" mode="parse">
<XRef name="{@name}"/>
</xsl:template>
<xsl:template match="a[@href]" mode="parse">
<XRef URL="{@href}">
<xsl:apply-templates/>
</XRef>
</xsl:template>
<xsl:template match="td/text()" mode="parse">
<xsl:copy-of select="d:htmlparse(., '', true())"/>
</xsl:template>
</xsl:stylesheet>