如何使用XSLT移除特定Namespace?附输入XML示例
使用XSLT移除特定命名空间的解决方案
没问题,我来帮你搞定这个需求!先看你的XML结构,里面有两个命名空间:根元素GNRequest的默认命名空间http://xmlns.tom.be/cms,以及InteractionType元素上的临时命名空间asdfasd。你要移除的应该是后者对吧?
下面是专门针对这个场景写的XSLT,它会保留原有XML的结构和内容,只移除InteractionType上的特定命名空间:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:cms="http://xmlns.tom.be/cms" xmlns:remove="asdfasd" exclude-result-prefixes="remove"> <!-- 复制所有节点和属性,除了需要处理的命名空间 --> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <!-- 处理带有要移除命名空间的元素:去掉命名空间,保留元素名称和内容 --> <xsl:template match="remove:*"> <xsl:element name="{local-name()}"> <xsl:apply-templates select="@*|node()"/> </xsl:element> </xsl:template> <!-- 保留根元素的默认命名空间(如果不需要保留,可直接删除此模板) --> <xsl:template match="cms:*"> <xsl:element name="{local-name()}" namespace="http://xmlns.tom.be/cms"> <xsl:apply-templates select="@*|node()"/> </xsl:element> </xsl:template> </xsl:stylesheet>
代码细节说明:
- 开头声明了两个命名空间前缀:
cms对应根元素的默认命名空间,remove对应你要移除的asdfasd命名空间,exclude-result-prefixes="remove"确保这个前缀不会出现在最终输出里。 - 第一个模板是通用复制模板,会原样复制所有节点和属性,这是XSLT处理XML的基础逻辑,保证大部分内容不需要额外处理。
- 第二个模板专门匹配带有
remove前缀的元素(也就是原asdfasd命名空间下的元素),用local-name()获取不带命名空间的元素名,重新创建一个无命名空间的元素,再复制它的属性和内容。 - 第三个模板确保根元素及其子元素(属于
cms命名空间)保留原有的命名空间,如果你的需求是连根元素的命名空间也要移除,直接删掉这个模板就行。
转换后的输出XML:
<GNRequest xmlns="http://xmlns.tom.be/cms"> <Input> <DocumentInputs> <DocumentInput> <Language>DE</Language> <TemplateInput> <MPC> <InteractionType>MobileProductOptionActivation</InteractionType> <SMdn>123456</SMdn> </MPC> </TemplateInput> </DocumentInput> </DocumentInputs> </Input> </GNRequest>
你可以看到,InteractionType上的xmlns="asdfasd"已经被移除,其他结构和内容完全保持原样。如果还有其他调整需求,比如同时移除根元素的命名空间,随时说就行!
内容的提问来源于stack exchange,提问作者stans
相关产品推荐
相关产品推荐

