如何从子元素中剥离本地命名空间?附现有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>
关键逻辑说明:
- 修正语法错误:你原来的代码里
<xsl:strip-space="*"/>是语法错误,改成标准的<xsl:strip-space elements="*"/>用来清理XML里的多余空白节点,让输出更整洁。 - 元素处理核心:
- 用
match="*"匹配所有元素,然后通过<xsl:element name="{local-name()}">创建一个完全不带命名空间的新元素。local-name()会自动去掉原元素的命名空间前缀(比如原元素是ns:user,就会生成纯user元素)。 - 只递归处理子节点,完全忽略原元素的所有属性,完美实现你要的属性剥离需求。
- 用
- 非元素节点保留:专门匹配文本、注释、处理指令这些节点,直接复制它们,避免这些内容被过滤掉。
效果示例
假设你有这样的输入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
相关产品推荐
相关产品推荐

