Это общее преобразование, которое принимает глобальный (заданный извне) параметр с именем удаляемого элемента:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:param name="pDeleteName" select="'c'"/>
<xsl:template match="node()|@*" name="identity">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="*">
<xsl:if test="not(name() = $pDeleteName)">
<xsl:call-template name="identity"/>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
при применении к любому документу XML (например, к следующему):
<a>
<b>
<c/>
<d>
<e>
<c>
<f/>
</c>
<g/>
</e>
</d>
</b>
</a>
получен правильный результат - исходный XML-документ, в котором любой элемент, имя которого совпадает со строкой в параметре pDeleteName
, удаляется :
<a>
<b>
<d>
<e>
<g/>
</e>
</d>
</b>
</a>
Как ясно видно, любое вхождение элемента <c>
было удалено.