防止重新映射默认命名空间
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>
我有一个 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>