如何将XML子节点的ns2命名空间移至EIWORoot根节点并移除子节点声明?
解决方案:将命名空间统一迁移至XML根节点
要实现把xmlns:ns2="urn:us:gov:hhs:acf:cseiwo"从子节点移到根节点EIWORoot并移除子节点内的该声明,你可以使用以下XSLT方案:
输入XML示例
<EIWORoot> <CaseData> <ns2:Household xmlns:ns2="urn:us:gov:hhs:acf:cseiwo"> <ns2:MemberCount>3</ns2:MemberCount> </ns2:Household> </CaseData> <ns2:Verification xmlns:ns2="urn:us:gov:hhs:acf:cseiwo">Completed</ns2:Verification> </EIWORoot>
目标XSLT代码
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ns2="urn:us:gov:hhs:acf:cseiwo"> <!-- 基础身份转换:默认复制所有节点和属性 --> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <!-- 处理根节点,添加统一的ns2命名空间声明 --> <xsl:template match="EIWORoot"> <EIWORoot xmlns:ns2="urn:us:gov:hhs:acf:cseiwo"> <xsl:apply-templates select="@*|node()"/> </EIWORoot> </xsl:template> <!-- 移除所有子节点上的ns2命名空间声明属性 --> <xsl:template match="@xmlns:ns2"/> </xsl:stylesheet>
预期输出XML
<EIWORoot xmlns:ns2="urn:us:gov:hhs:acf:cseiwo"> <CaseData> <ns2:Household> <ns2:MemberCount>3</ns2:MemberCount> </ns2:Household> </CaseData> <ns2:Verification>Completed</ns2:Verification> </EIWORoot>
关键逻辑说明
- 身份转换模板:作为基础模板,负责复制所有未被特殊模板匹配的节点和属性,保证原有XML结构和内容不变。
- 根节点处理模板:显式生成带有ns2命名空间声明的
EIWORoot根节点,确保命名空间在根节点统一声明。 - 移除子节点命名空间声明:通过匹配所有
@xmlns:ns2属性且不输出任何内容,直接删除子节点上的该命名空间声明。
注意:XSLT本身需要预先声明ns2命名空间,这样在处理带有ns2前缀的元素时,能正确保留其命名空间URI(前缀只是别名,真正起作用的是URI),避免元素丢失命名空间信息。
内容的提问来源于stack exchange,提问作者vij
相关产品推荐
相关产品推荐

