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

如何从子元素中剥离本地命名空间?附现有XSL代码

没问题,我帮你调整XSL代码,既能保留剥离元素属性的功能,又能彻底移除所有本地命名空间。先看修改后的完整代码,后面给你拆解逻辑:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output omit-xml-declaration="yes" indent="yes"/>
    <xsl:strip-space elements="*"/>

    <!-- 处理所有元素:移除命名空间 + 剥离属性 -->
    <xsl:template match="*">
        <!-- 创建无命名空间的新元素,用原元素的本地名称(去掉前缀) -->
        <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>

关键逻辑说明:

  1. 修正语法错误:你原来的代码里<xsl:strip-space="*"/>是语法错误,改成标准的<xsl:strip-space elements="*"/>用来清理XML里的多余空白节点,让输出更整洁。
  2. 元素处理核心:
    • 用match="*"匹配所有元素,然后通过<xsl:element name="{local-name()}">创建一个完全不带命名空间的新元素。local-name()会自动去掉原元素的命名空间前缀(比如原元素是ns:user,就会生成纯user元素)。
    • 只递归处理子节点,完全忽略原元素的所有属性,完美实现你要的属性剥离需求。
  3. 非元素节点保留:专门匹配文本、注释、处理指令这些节点,直接复制它们,避免这些内容被过滤掉。

效果示例

假设你有这样的输入XML:

<root xmlns:local="http://my-local-namespace.com">
    <local:product sku="1001" local:category="electronics">
        <local:name>Wireless Headphones</local:name>
        <!-- 促销说明 -->
        <?discount type="seasonal"?>
    </local:product>
</root>

转换后会输出:

<root>
    <product>
        <name>Wireless Headphones</name>
        <!-- 促销说明 -->
        <?discount type="seasonal"?>
    </product>
</root>

可以看到所有本地命名空间前缀被移除,元素属性也被彻底剥离,同时保留了文本、注释和处理指令。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:16:20