使用XSLT原样复制内容时XML标签重排,是否为微软XSLT转换Bug?
这大概率不是微软XSLT转换的Bug,而是默认输出格式化行为导致的
首先,你用的XslTransform是.NET Framework里的旧组件(早在.NET 2.0就被标记为过时,官方推荐用XslCompiledTransform替代),它在输出XML内容时,默认会对标签进行格式化处理——比如调整缩进、重排元素位置,目的是让输出的XML更易读,而非严格保留原始的标签排版结构。
你当前的代码直接用StringWriter接收转换结果,XslTransform会使用默认的XmlWriter配置,自动触发格式化逻辑,这就导致了标签重排的现象。
解决办法:控制输出格式,禁用自动格式化
如果你需要严格保留原始的标签结构,要通过配置XmlWriterSettings来禁用格式化,然后用自定义的XmlWriter来接收输出。这里分两种情况给出代码:
1. 推荐方案:迁移到XslCompiledTransform(更高效且受官方支持)
XPathDocument doc = new XPathDocument(new StringReader(data)); XslCompiledTransform xslTransform = new XslCompiledTransform(); xslTransform.Load(xslFile); // 配置XmlWriterSettings,禁用格式化 XmlWriterSettings settings = new XmlWriterSettings(); settings.Indent = false; // 关闭自动缩进 settings.OmitXmlDeclaration = false; // 根据需求决定是否保留XML声明 settings.NewLineHandling = NewLineHandling.None; // 不自动处理换行符 using (StringWriter sw = new StringWriter()) using (XmlWriter writer = XmlWriter.Create(sw, settings)) { xslTransform.Transform(doc, null, writer); string result = sw.ToString(); // 后续处理转换结果 }
2. 若坚持使用旧的XslTransform
同样可以通过XmlWriter来控制输出格式:
XPathDocument doc = new XPathDocument(new StringReader(data)); XslTransform xsltransform = new XslTransform(); xsltransform.Load(xslFile); XmlWriterSettings settings = new XmlWriterSettings(); settings.Indent = false; settings.NewLineHandling = NewLineHandling.None; using (StringWriter sw = new StringWriter()) using (XmlWriter writer = XmlWriter.Create(sw, settings)) { xsltransform.Transform(doc, null, writer); string result = sw.ToString(); // 后续处理转换结果 }
简单来说,这种标签重排是组件的默认格式化行为,而非Bug。通过调整输出配置,就能让XML标签保持你期望的排版啦。
内容的提问来源于stack exchange,提问作者Rishab
相关产品推荐
相关产品推荐

