Решение с XSLT будет выглядеть так:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output method="xml" encoding="UTF-8" indent="no"/>
<xsl:template match="*|@*">
<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<!-- trim whitespaces from the content -->
<xsl:template match="text()">
<!-- remove from tag to content -->
<xsl:variable name="trimmedHead" select="replace(.,'^\s+','')"/>
<xsl:variable name="trimmed" select="replace($trimmedHead,'\s+$','')"/>
<xsl:value-of select="$trimmed"/>
</xsl:template>
<!-- do not trim where text content exist -->
<xsl:template match="text()">
<xsl:if test="not(matches(.,'^\s+$'))">
<xsl:value-of select="."/>
</xsl:if>
</xsl:template>
Вы можете выбрать шаблон, который хотите использовать. Первый удаляет все пробелы также, когда контент существует, а второй удаляет только тогда, когда есть только пробелы или переводы строки.