Этот ОП скрыл самый важный факт о документе XML - как он говорит нам в более позднем комментарии: " XML использует пространство имен " ...
Вот решение этого столь уточненного вопроса :
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:x="some:namespace" xmlns="some:namespace"
exclude-result-prefixes="x">
<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="x:F">
<G>
<xsl:apply-templates/>
</G>
</xsl:template>
</xsl:stylesheet>
, когда это преобразование применяется к следующему документу XML (на основепространство имен, к которому допущен OP ...):
<T xmlns="some:namespace">
<A>
<B> </B>
<C> </C>
</A>
<D>
<E>Data</E>
<F>Data</F>
</D>
</T>
желаемый, правильный результат :
<T xmlns="some:namespace">
<A>
<B />
<C />
</A>
<D>
<E>Data</E>
<G>Data</G>
</D>
</T>
Объяснение :
Проблема в исходном коде заключается в следующем:
<xsl:template match="F">
Этот шаблон соответствует элементу F
, который не находится в пространстве имен.Однако все элементы настоящего XML-документа находятся в каком-то нераскрытом пространстве имен, а не в каком-либо пространстве имен.Поэтому приведенный выше шаблон не может соответствовать элементу F
в пространстве имен, поскольку такого элемента (F
в пространстве имен) не существует.
Решение состоит в том, чтобы определить то же пространство имен в преобразовании XSLT ичтобы шаблон соответствовал элементу F
в этом пространстве имен.