如何使用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>
工作原理
- 身份模板:作为基础模板,复制XML中的所有节点、属性、文本、注释和处理指令,保证原有结构与内容的完整性。
- 保留根节点命名空间:匹配根元素上所有以
xmlns开头的属性并直接复制,确保根节点的命名空间声明保留。 - 移除子节点命名空间:匹配所有非根元素上的命名空间属性,不执行复制操作,直接移除这些重复声明。
输入示例
<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
相关产品推荐
相关产品推荐

