如何移除XML根元素的无前缀xmlns命名空间?
移除XML根元素的无前缀默认命名空间方案
可以用XSLT模板实现这个需求,以下是具体的转换代码和说明:
核心XSLT转换模板
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <!-- 原样复制文本、注释、处理指令 --> <xsl:template match="text()|comment()|processing-instruction()"> <xsl:copy/> </xsl:template> <!-- 处理所有元素:移除默认命名空间,保留本地元素名 --> <xsl:template match="*"> <xsl:element name="{local-name()}"> <!-- 复制除默认命名空间外的所有属性 --> <xsl:copy-of select="@*[namespace-uri() != 'http://www.example.com/mdm/readingxml/2011/07']"/> <!-- 保留xsd和xsi的命名空间声明 --> <xsl:copy-of select="namespace::xsd|namespace::xsi"/> <!-- 递归处理子节点 --> <xsl:apply-templates/> </xsl:element> </xsl:template> </xsl:stylesheet>
模板说明
- 针对元素节点:通过
local-name()获取不带命名空间前缀的元素名称,创建新的无默认命名空间的元素 - 过滤掉默认命名空间的属性,只保留xsd、xsi相关的命名空间声明和其他属性
- 原样保留文本、注释等非元素节点内容
示例效果
输入XML
<Root xmlns="http://www.example.com/mdm/readingxml/2011/07" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <child1>child1</child1> <child2>child2</child2> <child3>child3</child3> <child4>child4</child4> </Root>
转换后输出XML
<Root xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <child1>child1</child1> <child2>child2</child2> <child3>child3</child3> <child4>child4</child4> </Root>
内容的提问来源于stack exchange,提问作者Nilesh Jha
相关产品推荐
相关产品推荐

