You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:02:36