如何从XML元素中移除单个命名空间?附现有XML及XSLT代码
移除XML中的指定命名空间解决方案
针对你提供的XML文档和XSLT需求,这里有一个可行的方案来移除其中一个命名空间(比如默认的www.ns1.com),同时保留另一个命名空间的内容:
首先,先回顾你的原XML文档:
<?xml version="1.0" encoding="UTF-8"?> <Document xmlns = "www.ns1.com" xmlns:ns2 = "www.ns2.com"> <node1> <node2 addy1="something">value</node2> </node1> </Document>
完整的XSLT转换代码
<?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ns1="www.ns1.com" <!-- 声明要移除的默认命名空间,用于匹配元素 --> xmlns:ns2="www.ns2.com" <!-- 保留需要的命名空间 --> exclude-result-prefixes="ns1"> <!-- 输出时排除ns1前缀 --> <!-- 输出设置,保留格式 --> <xsl:output method="xml" indent="yes" encoding="UTF-8"/> <!-- 匹配根节点,创建不带ns1命名空间的根元素 --> <xsl:template match="ns1:Document"> <Document xmlns:ns2="www.ns2.com"> <xsl:apply-templates select="@* | node()"/> </Document> </xsl:template> <!-- 匹配所有ns1命名空间下的元素,创建不带命名空间的新元素 --> <xsl:template match="ns1:*"> <xsl:element name="{local-name()}"> <xsl:apply-templates select="@* | node()"/> </xsl:element> </xsl:template> <!-- 匹配所有属性、文本等内容,直接复制 --> <xsl:template match="@* | text() | comment() | processing-instruction()"> <xsl:copy/> </xsl:template> </xsl:stylesheet>
代码解释
- 命名空间声明:我们先声明原XML的
ns1和ns2命名空间,这样XSLT才能正确匹配对应命名空间下的元素。exclude-result-prefixes="ns1"确保输出结果里不会出现ns1的前缀。 - 根节点模板:专门匹配原根元素
ns1:Document,创建一个不带默认命名空间但保留ns2的新根元素。 - 元素模板:匹配所有
ns1命名空间下的子元素,用local-name()获取元素的本地名称,创建不带命名空间的新元素。 - 通用复制模板:直接复制属性、文本、注释等内容,确保其他内容不会丢失。
转换后的输出结果
<?xml version="1.0" encoding="UTF-8"?> <Document xmlns:ns2="www.ns2.com"> <node1> <node2 addy1="something">value</node2> </node1> </Document>
如果你需要移除的是ns2命名空间,只需要调整模板匹配的命名空间即可:把ns1相关的替换成ns2,保留默认命名空间。比如根节点模板改成匹配ns2:相关元素,创建不带ns2的元素。
内容的提问来源于stack exchange,提问作者TheUltimateHack
相关产品推荐
相关产品推荐

