Я согласен, XSL будет лучшим подходом. Если вы хотите превратить его во что-то, что на самом деле выглядит как XML, но только внутри HTML, вы можете использовать что-то вроде этого:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!-- Evaluate Attributes -->
<xsl:template match="@*">
<span class="attribute">
<span class="name">
<xsl:value-of select="name()"/>
</span>="<span class="value"><xsl:value-of select="." /></span>"
</span>
</xsl:template>
<!-- Evaluate Elements -->
<xsl:template match="*" priority="10">
<div class="element">
<!-- First, create the opening tag with the attributes -->
<<span class="name"><xsl:value-of select="name()"/></span><xsl:apply-templates select="@*"/>>
<!-- Then, add children -->
<xsl:apply-templates select="node()"/>
<!-- Finally, add the closing tag -->
</<span class="name"><xsl:value-of select="name()"/></span>>
</div>
</xsl:template>
<!-- Just copy everything else (text, comments, etc.) -->
<xsl:template match="node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
И добавьте немного CSS:
.element{margin-left:4em;font-size:14px;}
.element .name{color:blue;}
.attribute{margin-left:8px}
UPDATE:
<!-- Root node -->
<xsl:template match="/">
<div class="element">
<<span class="name"><xsl:value-of select="name()"/></span><xsl:apply-templates select="@*"/>
<!-- Grab all namespaces and declare them. distinct-values() is XPath 2.0, however. -->
<xsl:for-each select="distinct-values(//namespace::*)">
xmlns:<xsl:value-of select="name()" />="<xsl:value-of select="." />"
</xsl:for-each>
>
<xsl:apply-templates select="node()"/>
</<span class="name"><xsl:value-of select="name()"/></span>>
</div>
</xsl:template>