如何为XML根元素添加xmlns属性并避免标签自闭合?
解决XML根元素添加命名空间+保留非自闭合空标签的问题
折腾了一整天的问题,我来帮你搞定!要同时实现给<INPUTS>添加xmlns="GE_Schemas",还得让空标签保持<Zone></Zone>这种非自闭合形式,我们可以通过调整XSLT的模板逻辑来解决这两个问题:
1. 核心思路拆解
- 根元素自闭合问题:之前的XSLT可能没有正确处理根元素的子节点,导致输出了自闭合的
<INPUTS/>。我们需要手动创建带命名空间的根元素,并确保它包含所有子节点。 - 空标签自闭合问题:默认XSLT处理器会自动把空元素折叠成自闭合形式,所以需要专门写一个模板,强制输出完整的开始和结束标签。
2. 完整XSLT代码示例
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- 配置输出格式,确保XML声明和缩进 --> <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" omit-xml-declaration="no"/> <!-- 匹配根元素INPUTS,添加目标命名空间 --> <xsl:template match="/INPUTS"> <INPUTS xmlns="GE_Schemas"> <!-- 复制所有子节点(元素、文本、注释、属性等) --> <xsl:apply-templates select="@*|node()"/> </INPUTS> </xsl:template> <!-- 匹配所有空元素(无任何子节点的元素),强制输出非自闭合形式 --> <xsl:template match="*[not(node())]"> <!-- 手动输出开始标签 --> <xsl:text disable-output-escaping="yes"><</xsl:text> <xsl:value-of select="local-name()"/> <!-- 复制元素的所有属性 --> <xsl:for-each select="@*"> <xsl:text> </xsl:text> <xsl:value-of select="name()"/> <xsl:text>="</xsl:text> <xsl:value-of select="."/> <xsl:text>"</xsl:text> </xsl:for-each> <!-- 手动输出结束标签 --> <xsl:text disable-output-escaping="yes">></</xsl:text> <xsl:value-of select="local-name()"/> <xsl:text disable-output-escaping="yes">></xsl:text> </xsl:template> <!-- 默认模板:处理所有非空元素、文本、注释等,确保原样复制 --> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> </xsl:stylesheet>
3. 代码说明
- 根元素处理:通过模板匹配
/INPUTS,直接创建带有xmlns="GE_Schemas"的根元素,并用<xsl:apply-templates>把所有子节点导入进来,这样根元素因为包含内容,绝不会变成自闭合形式。 - 空元素处理:模板匹配
*[not(node())](所有没有子节点的元素),通过xsl:text配合disable-output-escaping="yes"手动拼接标签的开始和结束部分,彻底避免处理器自动折叠成自闭合标签。 - 默认模板:确保非空元素、文本、注释、属性等都被原样复制,不破坏原有XML的其他内容。
4. 测试效果
假设你的源A.xml是这样的:
<INPUTS> <Zone/> <DeviceID>12345</DeviceID> <Location/> </INPUTS>
应用上述XSLT后,输出的B.xml会是:
<?xml version="1.0" encoding="UTF-8"?> <INPUTS xmlns="GE_Schemas"> <Zone></Zone> <DeviceID>12345</DeviceID> <Location></Location> </INPUTS>
完全符合你的需求:根元素带命名空间,空标签保持非自闭合形式!
内容的提问来源于stack exchange,提问作者Bjorn Mistiaen
相关产品推荐
相关产品推荐

