我有一个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>
答案 0 :(得分:1)
尝试将b
的模板更改为以下内容:
<xsl:template match="//b">
<xsl:element name="changedB" namespace="http://mynamespace.com">
<xsl:value-of select="text()"/>
</xsl:element>
</xsl:template>