.NET用Saxon运行XSLT时xsl:result-document报主输出文件系统标识符未知错
错误原因
Saxon执行xsl:result-document时需要通过基准URI解析相对路径Batch-{position()}.xml,你当前代码仅配置了XML输入的BaseUri,未给XSLT转换器设置输出基准URI,且主输出绑定的是内存StringWriter,没有关联文件系统路径,导致Saxon无法确定拆分文件的存储位置,触发该报错。
修复方案
在初始化XsltTransformer后新增BaseOutputUri配置,指定拆分文件的输出根目录即可,修改后的C#代码如下:
using System.IO; using Saxon.Api; public static string SaxonProcessorXSLT(string xmlToExport, string xslStylesheet, string outputRootPath) { // 提前创建输出目录避免IO错误 if (!Directory.Exists(outputRootPath)) { Directory.CreateDirectory(outputRootPath); } using (StringReader xmlStream = new StringReader(xmlToExport)) { using (StringReader xslStream = new StringReader(xslStylesheet)) { Processor xsltProcessor = new Processor(); DocumentBuilder documentBuilder = xsltProcessor.NewDocumentBuilder(); documentBuilder.BaseUri = new Uri("file://"); XdmNode xdmNode = documentBuilder.Build(xmlStream); XsltCompiler xsltCompiler = xsltProcessor.NewXsltCompiler(); XsltExecutable xsltExecutable = xsltCompiler.Compile(xslStream); XsltTransformer xsltTransformer = xsltExecutable.Load(); xsltTransformer.InitialContextNode = xdmNode; // 新增:设置输出基准URI,路径末尾必须加斜杠 xsltTransformer.BaseOutputUri = new Uri($"file:///{outputRootPath.Replace("\\", "/")}/"); using (StringWriter stringWriter = new StringWriter()) { Serializer serializer = xsltProcessor.NewSerializer(); serializer.SetOutputWriter(stringWriter); xsltTransformer.Run(serializer); // 当前XSLT无主输出内容,返回值为空,可根据需求调整逻辑 return stringWriter.ToString(); } } } }
调用示例
如果要将拆分文件输出到D:\BatchOutput\目录,调用时传入对应路径即可:
SaxonProcessorXSLT("你的XML内容", "你的XSLT内容", @"D:\BatchOutput");
内容的提问来源于stack exchange,提问作者Imran Gani
相关产品推荐
相关产品推荐

