Атрибут copy-namespaces="no"
не удаляет все узлы пространства имен - как указано в спецификации XSLT 2.0 :
Если требуетсязначение no, то ни один из узлов пространства имен не копируется: однако узлы пространства имен все равно будут созданы в дереве результатов, как того требует процесс исправления пространства имен: см. 5.7.3 Исправление пространства имен.Этот атрибут влияет на все элементы, скопированные с помощью этой инструкции: как элементы, выбранные непосредственно выражением выбора, так и элементы, являющиеся потомками узлов, выбранных выражением выбора .
Вот пример того, какизбавиться от всех (необязательных) узлов пространства имен :
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="*">
<xsl:element name="{local-name()}">
<xsl:apply-templates select="node()|@*"/>
</xsl:element>
</xsl:template>
<xsl:template match="@*">
<xsl:attribute name="{local-name()}">
<xsl:value-of select="."/>
</xsl:attribute>
</xsl:template>
</xsl:stylesheet>
Когда это общее преобразование применяется к этому документу XML:
<x:nums xmlns:x="my:x">
<x:num>01</x:num>
<x:num>02</x:num>
<x:num>03</x:num>
<x:num>04</x:num>
<x:num>05</x:num>
<x:num>06</x:num>
<x:num>07</x:num>
<x:num>08</x:num>
<x:num>09</x:num>
<x:num>10</x:num>
</x:nums>
желаемый, правильный результат получается:
<nums>
<num>01</num>
<num>02</num>
<num>03</num>
<num>04</num>
<num>05</num>
<num>06</num>
<num>07</num>
<num>08</num>
<num>09</num>
<num>10</num>
</nums>
Do note :
Преобразование не XSLT-2.0 - специфичен и может использоваться также с XSLT 1.0.
Удаление всех узлов пространства имен обычно небезопасно, поскольку все узлы из разных пространств имен помещаются в «нет пространства имен»,В этом процессе некоторые атрибуты могут быть потеряны, и процесс, как правило, необратим (не 1: 1).