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

.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中调用:

    1. 编写包含原脚本逻辑的扩展类:
    public class XsltCustomExtensions
    {
        // 对应原脚本中的方法逻辑
        public string ProcessCardData(string cardNumber)
        {
            // 实现原脚本的处理逻辑
            return cardNumber.Substring(0, 4) + "****" + cardNumber.Substring(cardNumber.Length - 4);
        }
    }
    
    1. 修改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>
    
    1. 修改加载和转换代码,传入扩展对象:
    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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 19:37:17