Таким образом, вы, кажется, хотите преобразовать элементы без пространства имен в пространство имен корневого элемента:
<xsl:template match="*[namespace-uri() = '']">
<xsl:element name="{local-name()}" namespace="{namespace-uri(/*)}">
<xsl:apply-templates select="@* | node()"/>
</xsl:element>
</xsl:template>
, что вместе с преобразованием идентичности дает
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="*[namespace-uri() = '']">
<xsl:element name="{local-name()}" namespace="{namespace-uri(/*)}">
<xsl:apply-templates select="@* | node()"/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
и результатыв https://xsltfiddle.liberty -development.net / eiZQaFX
<MYXML xmlns="http://someURL/MYXML" xmlns:role="http://someURL/role">
<firstElement>
<LANGUAGE>Spanish</LANGUAGE>
<VOCABULARY>Spain</VOCABULARY>
</firstElement>
<External>
<EXTARData />
<AnotherElementData>
<AnotherElement xmlns="http://someURL/AnotherElement" xmlns:myxml="http://someURL/MYXML" />
</AnotherElementData>
</External>
</MYXML><!--checksum=A477829F524D170104E87187AD2869F5443DD079196B0EDCD5C6B9CFDD315232 version=1-->
Как видите, это не совсем тот результат, который вы показали, поскольку преобразование идентичности в XSLT 1 копирует пространство имен xmlns:myxml="http://someURL/MYXML"
это было в поле зрения AnotherElement
.
Эту проблему можно легко избежать с помощью процессора XSLT 2 или 3, используя
см. https://xsltfiddle.liberty -development.net / eiZQaFX / 1 .
С процессором XSLT 1 вам потребуется больше усилий, чтобы убедиться, что элементы копируются без каких-либо пространств имен:
<xsl:template match="*[namespace-uri() = '']//*[namespace-uri() != '']">
<xsl:element name="{name()}" namespace="{namespace-uri()}">
<xsl:apply-templates select="@* | node()"/>
</xsl:element>
</xsl:template>
CompleteНапример,
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="*[namespace-uri() = '']">
<xsl:element name="{local-name()}" namespace="{namespace-uri(/*)}">
<xsl:apply-templates select="@* | node()"/>
</xsl:element>
</xsl:template>
<xsl:template match="*[namespace-uri() = '']//*[namespace-uri() != '']">
<xsl:element name="{name()}" namespace="{namespace-uri()}">
<xsl:apply-templates select="@* | node()"/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
в https://xsltfiddle.liberty -development.net / eiZQaFX / 2