С учетом ваших пояснений в комментариях я бы предложил:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ns="http://my.ns.uri">
<xsl:output method="xml" version="1.0" omit-xml-declaration="yes" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="*">
<xsl:element name="ns:{local-name()}">
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
<xsl:template match="*[@*]">
<xsl:element name="ns:{local-name()}">
<xsl:element name="ns:{local-name()}">
<xsl:apply-templates/>
</xsl:element>
<xsl:apply-templates select="@*"/>
</xsl:element>
</xsl:template>
<xsl:template match="@*">
<xsl:element name="ns:{local-name()}">
<xsl:value-of select="."/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
В чем разница?
При применении к следующий пример ввода:
XML
<lm:GetInvoiceList xmlns:lm="http://www.w3.org">
<lm:Response>
<lm:Bill>
<lm:BillPropertyA subPropertyA="first subproperty">first property</lm:BillPropertyA>
<lm:BillPropertyB subPropertyB="second subproperty"/>
<lm:BillPropertyC>second property</lm:BillPropertyC>
</lm:Bill>
</lm:Response>
</lm:GetInvoiceList>
результат будет:
<ns:GetInvoiceList xmlns:ns="http://my.ns.uri">
<ns:Response>
<ns:Bill>
<ns:BillPropertyA>
<ns:BillPropertyA>first property</ns:BillPropertyA>
<ns:subPropertyA>first subproperty</ns:subPropertyA>
</ns:BillPropertyA>
<ns:BillPropertyB>
<ns:BillPropertyB/>
<ns:subPropertyB>second subproperty</ns:subPropertyB>
</ns:BillPropertyB>
<ns:BillPropertyC>second property</ns:BillPropertyC>
</ns:Bill>
</ns:Response>
</ns:GetInvoiceList>
в отличие от:
<ns:GetInvoiceList xmlns:ns="http://my.ns.uri">
<ns:Response>
<ns:Bill>
<ns:BillPropertyA>
<ns:subPropertyA>first subproperty</ns:subPropertyA>
<ns:BillPropertyA>first property</ns:BillPropertyA>
</ns:BillPropertyA>
<ns:BillPropertyB>
<ns:subPropertyB>second subproperty</ns:subPropertyB>
</ns:BillPropertyB>
<ns:BillPropertyC>
<ns:BillPropertyA>second property</ns:BillPropertyA>
</ns:BillPropertyC>
</ns:Bill>
</ns:Response>
</ns:GetInvoiceList>
, который неправильно помещает текстовый узел «второго свойства» в другой экземпляр ns:BillPropertyA
и делает дочерний элемент ns:BillPropertyC
.
Примечания:
xsl:copy
, так как это также скопирует существующее пространство имен;