Это преобразование :
<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="*[not(ancestor-or-self::country)]">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="country[not(@name='japan')]"/>
</xsl:stylesheet>
при применении к предоставленному документу XML :
<countries>
<country name="india">
<name>Rajan</name>
<pop>90.09</pop>
<car>Audi</car>
</country>
<country name="japan">
<name>Yenhovong</name>
<pop>172</pop>
<car>Sumo</car>
</country>
</countries>
дает желаемый, правильный результат :
<country name="japan">
<name>Yenhovong</name>
<pop>172</pop>
<car>Sumo</car>
</country>
Примечание :
Правило идентификации используется для копирования каждого требуемого узла "как есть". Использование и переопределение шаблона идентификации является наиболее фундаментальным шаблоном проектирования XSLT.
Один шаблон переопределяет правило идентификации для любого элемента, который имеет country
предка или сам по себе не является элементом country
. Такие элементы не копируются в вывод, но их дочерние узлы обрабатываются.
Переопределяющий шаблон, соответствующий любому элементу country
, атрибут которого name
не равен 'japan'
. У него пустое тело, поэтому любые такие элементы игнорируются / удаляются / не копируются.
Результат от 1 до 3 выше заключается в том, что только элемент country
, атрибут name
которого 'japan'
, обрабатывается шаблоном идентификации и копируется в выходной файл.