Используйте
<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="*[starts-with(name(), 'XYZ_')]"/>
</xsl:stylesheet>
при применении к предоставленному документу XML :
<?xml version="1.0" encoding="UTF-8"?>
<tags>
<tag>
<tag1>TagName1</tag1>
<XYZ_1>
<name>1.pdf</name>
</XYZ_1>
<XYZ_2>
<c_name>chart1.gif</c_name>
</XYZ_2>
</tag>
</tags>
желаемый, правильный результат получается :
<tags>
<tag>
<tag1>TagName1</tag1>
</tag>
</tags>
Объяснение
Правило идентификации (если не переопределено) копирует каждый узел как есть
Единственный переопределяющий шаблон - это соответствующие элементы, у которых name()
starts-with()
"XYZ _" и этот шаблон имеет пустое тело - это эффективно удаляет любой соответствующий элемент из выходных данных.
Директива <xsl:strip-space elements="*"/>
дает указание процессору XSLT анализировать документ XML, игнорируя любой текстовый узел, содержащий только пробелы, в документе. Таким образом, при преобразовании не виден ни один пробельный узел, следовательно, такие узлы не копируются в выходные данные. Это устраняет нежелательные пробелы, о которых сообщается как вторая проблема.