Это преобразование :
<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()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match=
"attributes[not(node())]
|
attribute[not(attributeName/text())]
"/>
</xsl:stylesheet>
при применении к этому документу XML (обратите внимание на пустые <attributes>
и attribute/attributeName
в конце):
<attributes>
<attribute>
<attributeName>agenda-group</attributeName>
<value>generic</value>
</attribute>
<attribute>
<attributeName>auto-focus</attributeName>
<value>true</value>
</attribute>
<attribute>
<attributeName>no-loop</attributeName>
<value>true</value>
</attribute>
<attribute>
<attributeName>salience</attributeName>
<value>73</value>
</attribute>
<attribute>
<attributeName></attributeName>
<value></value>
</attribute>
<attributes/>
</attributes>
дает желаемый результат (пустые элементы игнорируются - не копируются):
<attributes>
<attribute>
<attributeName>agenda-group</attributeName>
<value>generic</value>
</attribute>
<attribute>
<attributeName>auto-focus</attributeName>
<value>true</value>
</attribute>
<attribute>
<attributeName>no-loop</attributeName>
<value>true</value>
</attribute>
<attribute>
<attributeName>salience</attributeName>
<value>73</value>
</attribute>
</attributes>
Объяснение : Правило идентификации (которое копирует каждый узел "как есть") переопределяется одним шаблоном, который соответствует требуемым "пустым" элементам и не имеет тела, поэтому их просто пропускают /ignored.