You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用XSLT移除XML中的命名空间声明但保留前缀?

使用XSLT移除子节点重复的命名空间声明(保留前缀)

需求概述

需要移除XML中子节点上重复的命名空间声明,但保留节点前缀以及根节点的命名空间声明。

最简XSLT方案

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <!-- 身份模板:复制所有节点、文本、注释、处理指令 -->
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

    <!-- 保留根元素的命名空间声明 -->
    <xsl:template match="/*/@*[starts-with(name(), 'xmlns')]">
        <xsl:copy/>
    </xsl:template>

    <!-- 移除子元素上的所有命名空间声明 -->
    <xsl:template match="*[not(self::/*)]/@*[starts-with(name(), 'xmlns')]"/>
</xsl:stylesheet>

工作原理

  1. 身份模板:作为基础模板,复制XML中的所有节点、属性、文本、注释和处理指令,保证原有结构与内容的完整性。
  2. 保留根节点命名空间:匹配根元素上所有以xmlns开头的属性并直接复制,确保根节点的命名空间声明保留。
  3. 移除子节点命名空间:匹配所有非根元素上的命名空间属性,不执行复制操作,直接移除这些重复声明。

输入示例

<Body>  
<n1:ParentNode xmlns:n1="test1" xmlns:n2="test2"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <School>
        <n1:SchoolInfo xmlns:n1="test1">
          <SchoolID1>
             <n2:ID xmlns:n2="test2">BAS123</n2:ID>
          </SchoolID1>
        </n1:SchoolInfo>          
     </School>              
</Body>               

输出结果

<Body>  
<n1:ParentNode xmlns:n1="test1" xmlns:n2="test2"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <School>
        <n1:SchoolInfo>
          <SchoolID1>
             <n2:ID>BAS123</n2:ID>
          </SchoolID1>
        </n1:SchoolInfo>          
     </School>              
</Body>  

内容的提问来源于stack exchange,提问作者Vijay Pullamsetty

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 18:15:27