.NET6迁移时XslCompiledTransform脚本编译报错求解决方案
.NET6迁移中XSLT脚本块编译错误的解决办法
已知.NET6仍不支持XSLT中的JScript/C#脚本块功能,从.NET Framework迁移代码时,执行以下加载XSLT的代码会抛出异常:XSLT编译错误;.NET Core不支持编译JScript/C#脚本
XslCompiledTransform xslt = new XslCompiledTransform(); XsltSettings sets = new XsltSettings(true, true); var resolver = new XmlUrlResolver(); var styleSheetUri = @"C:\Users\xxxxx\buildCardtypeProd.xslt"; // 此行抛出异常 xslt.Load(styleSheetUri, sets, resolver);
已尝试Mvp.Xml、Mvp.Xml.NetStandard NuGet包,问题仍存在,以下是可行的解决办法:
重构XSLT移除脚本块
将XSLT中的C#/JScript逻辑替换为纯XSLT 1.0语法,比如用xsl:template定义复用逻辑,或用XPath内置函数实现计算、字符串处理等操作。这是最彻底的方案,完全摆脱对.NET脚本编译功能的依赖,兼容性最强。用自定义扩展对象替代脚本逻辑
把原脚本中的逻辑封装成.NET类的公共方法,通过XsltArgumentList传入XSLT中调用:- 编写包含原脚本逻辑的扩展类:
public class XsltCustomExtensions { // 对应原脚本中的方法逻辑 public string ProcessCardData(string cardNumber) { // 实现原脚本的处理逻辑 return cardNumber.Substring(0, 4) + "****" + cardNumber.Substring(cardNumber.Length - 4); } }- 修改XSLT添加命名空间引用:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:custom="urn:xslt-custom-extensions"> <!-- 在需要的位置调用扩展方法 --> <xsl:value-of select="custom:ProcessCardData(./CardNumber)" /> </xsl:stylesheet>- 修改加载和转换代码,传入扩展对象:
XslCompiledTransform xslt = new XslCompiledTransform(); XsltSettings sets = new XsltSettings(true, true); var resolver = new XmlUrlResolver(); xslt.Load(@"C:\Users\xxxxx\buildCardtypeProd.xslt", sets, resolver); // 创建扩展对象并添加到参数列表 XsltArgumentList transformArgs = new XsltArgumentList(); transformArgs.AddExtensionObject("urn:xslt-custom-extensions", new XsltCustomExtensions()); // 执行转换时传入参数列表 using (var output = new FileStream(@"output.xml", FileMode.Create)) { xslt.Transform(@"input.xml", transformArgs, output); }Windows环境下的临时兼容方案
如果应用仅在Windows运行,可创建一个.NET Framework类库封装XSLT转换逻辑,然后在.NET6项目中通过进程调用或COM互操作的方式调用该类库。此方案会增加架构复杂度,仅适合短期过渡,不推荐作为长期解决方案。
内容的提问来源于stack exchange,提问作者jase
相关产品推荐
相关产品推荐

