技术问询:用XSLT移除XML输出的默认命名空间并保留其他命名空间
移除XML默认命名空间并保留其他命名空间的XSLT方案
没问题,我来帮你搞定这个需求——移除XML里的默认命名空间http://apr,同时完整保留其他已有的命名空间。下面是具体的实现方案:
第一步:编写针对性的XSLT样式表
这个XSLT会遍历所有节点和属性,仅移除目标默认命名空间,其他内容原样保留:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:apr="http://apr"> <!-- 先声明要移除的默认命名空间,方便匹配 --> <!-- 复制所有节点,但处理命名空间 --> <xsl:template match="*"> <xsl:choose> <!-- 如果是目标默认命名空间的节点,创建不带命名空间的新节点 --> <xsl:when test="namespace-uri() = 'http://apr'"> <xsl:element name="{local-name()}"> <xsl:apply-templates select="@* | node()"/> </xsl:element> </xsl:when> <!-- 其他命名空间的节点,原样复制(保留自身命名空间) --> <xsl:otherwise> <xsl:copy> <xsl:apply-templates select="@* | node()"/> </xsl:copy> </xsl:otherwise> </xsl:choose> </xsl:template> <!-- 复制所有属性(包括其他命名空间的属性) --> <xsl:template match="@*"> <xsl:copy/> </xsl:template> <!-- 复制文本、注释等节点 --> <xsl:template match="text() | comment() | processing-instruction()"> <xsl:copy/> </xsl:template> </xsl:stylesheet>
第二步:转换后的XML结果
用上面的XSLT处理你提供的示例XML后,会得到如下结果:
<p:Value xmlns:p="http://www.test.be/communication/xml/v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.test/communication/xml/v2 sample.xsd "> <Data> Extra name space add using xslt need to remove this <Name>Apple</Name> </Data> </p:Value>
关键逻辑说明
- 我们先在XSLT里声明了要移除的
http://apr命名空间(前缀apr只是方便内部引用,不影响输出) - 匹配所有节点时,判断节点的命名空间是否为目标值:如果是,就用
local-name()创建一个不带命名空间的新节点;否则直接复制原节点(保留其原有命名空间) - 属性、文本、注释等内容都直接复制,确保其他命名空间和数据完全保留
内容的提问来源于stack exchange,提问作者stans
相关产品推荐
相关产品推荐

