Следующая модификация правила идентификации , вероятно, является самым простым и элегантным решением :
<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:template match="node()[not(self::b or self::d)]|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
когда это преобразование применяется к предоставленному документу XML :
<a>
<b>
<c>everything below</c>
<d></d>
</b>
<b>
<c>everything below</c>
<d></d>
</b>
</a>
желаемый, правильный результат получается :
<a>
<c>everything below</c>
<c>everything below</c>
</a>
Объяснение:
Эта модификация правила идентификации копирует каждый узел "как есть", за исключением любых элементов b
или d
.
Любые элементы b
или d
обрабатываются стандартным (встроенным) XSLT-шаблоном для элементов, который применяет шаблоны к своим дочерним элементам (у них их нет, поэтому желаемый эффект «удаления» достигнуто).