防止重新映射默认命名空间

Prevent remapping of default namespace

我有一个 xml 文档如下。我正在尝试删除元素 "b" 并将其替换为 "changedB" 并且应该复制所有其他元素。我的问题是,当 "input" 元素被复制到它上面时,默认名称空间已经映射到一个空前缀。但是,当我的模板将 "b" 替换为 "changedB" 时,它会使用前缀重新映射名称空间。我怎样才能避免额外的 myns:changedB xlmns:myns 只出现在 elementB 中。尽管它是合法的 XML 文档,但在转换后的输出中看起来很奇怪。

XML:

<input xmlns="http://mynamespace.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <a>elementa</a>
    <b>elementb</b>
</input>

XSL:

<?xml version="1.0"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:myns="http://mynamespace.com"
                xpath-default-namespace="http://mynamespace.com">
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="//b">
        <myns:changedB><xsl:value-of select="text()"/></myns:changedB>
    </xsl:template>
</xsl:stylesheet>

输出:

<?xml version="1.0" encoding="UTF-8"?><input xmlns="http://mynamespace.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <a>elementa</a>
    <myns:changedB xmlns:myns="http://mynamespace.com">elementb</myns:changedB>
</input>

尝试将 b 的模板更改为以下内容:

<xsl:template match="//b">
    <xsl:element name="changedB" namespace="http://mynamespace.com">
        <xsl:value-of select="text()"/>
    </xsl:element>
</xsl:template>