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

时间:2015-07-09 06:33:38

标签: xml xslt-2.0

我有一个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>

1 个答案:

答案 0 :(得分:1)

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

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