Текущие два решения слишком длинные, и одно из них даже не является правильно сформированным XML ...
Вот краткое и полное решение :
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="link">
<a href="[{xref/@label}]">
<xsl:apply-templates/>
</a>
</xsl:template>
<xsl:template match="emphasis">
<xsl:element name="{substring(@type,1,1)}">
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
<xsl:template match="xref">
<xsl:apply-templates/>
</xsl:template>
</xsl:stylesheet>
когда это преобразование применяется к предоставленному документу XML:
<paragraph>This paragraph has things like <link><xref label="lbl1">this</xref></link> and things like <emphasis type="bold">this</emphasis> and <emphasis type="italic">this</emphasis>.
</paragraph>
желаемый, правильный результат получается :
<paragraph>This paragraph has things like <a href="[lbl1]">this</a> and things like <b>this</b> and <i>this</i>.
</paragraph>