XSLT转换后命名空间前缀丢失,如何保留原有命名空间?
解决XSL转换后丢失XML命名空间的问题
你的问题出在使用了<xsl:copy>进行节点复制——这是浅拷贝,只会复制当前节点直接关联的命名空间,无法保留XML文档中定义但当前节点未直接使用的命名空间。要完整保留所有原有命名空间,需要在模板中显式复制所有命名空间节点。
修改后的完整XSL代码
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output omit-xml-declaration="yes" encoding="utf-8" indent="yes"/> <xsl:strip-space elements="*"/> <xsl:template match="@*|node()"> <xsl:copy> <!-- 显式复制所有命名空间节点 --> <xsl:copy-of select="namespace::*"/> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> </xsl:stylesheet>
关键说明
<xsl:copy-of select="namespace::*"/>:这条语句会复制当前节点上下文的所有命名空间节点,包括那些未被当前节点直接使用但在原文档中存在的命名空间声明,确保转换后的XML完全保留原文档的命名空间结构。- 原有的空行移除(
<xsl:strip-space elements="*"/>)和输出格式化配置保持不变,依然可以实现你需要的移除空行、UTF-8编码输出的效果。
内容的提问来源于stack exchange,提问作者LMH
相关产品推荐
相关产品推荐

