Выбросьте весь свой код и используйте это:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" encoding="UTF-8" indent="yes" />
<xsl:template match="node() | @*">
<xsl:copy>
<xsl:apply-templates select="node() | @*" />
</xsl:copy>
</xsl:template>
<xsl:template match="*[not(*) and normalize-space() = '']" />
</xsl:stylesheet>
Приведенная выше таблица стилей скопирует все, что не пусто.
Элементы, которые не имеют дочерних элементов (*[not(*)]
) и элементы с пустым текстовым содержимым (*[normalize-space() = '']
), «выбрасываются» (т. Е. Вывод not ) вторым шаблоном, всеelse копируется как есть первым шаблоном.
Чтобы удалить все элементы, которые не содержат ничего, кроме вложенных пустых элементов, вы можете использовать это как второй шаблон:
<xsl:template match="*[normalize-space() = '']" />