首页 > 解决方案 > Blazor - 此框架不支持“msxsl:script”元素,因为它不支持运行时代码生成

问题描述

我在 Blazor Webassembly 中使用 XslCompiledTransform 时遇到问题。

blazor.webassembly.js:1 crit: Microsoft.AspNetCore.Components.WebAssembly.Rendering.WebAssemblyRenderer[100] 未处理的异常渲染组件:此框架不支持“msxsl:script”元素,因为它不支持运行时代码生成

谷歌浏览器控制台中的错误

public async Task<string> TransformSomething(string xml, string kluczPakietu, string kodPakietu)
        {
            var xslFile = await _httpClient.GetByteArrayAsync("transform.xsl");

            //change bytearray to string - valid is working here.
            string transformataHTML = System.Text.Encoding.Default.GetString(xslFile);

            
            XDocument oldDocument = XDocument.Parse(xml);
            var newDocument = new XDocument();


            
            using (var stringReader = new StringReader(transformataHTML))
            {
                using (XmlReader xsltReader = XmlReader.Create(stringReader))
                {
                    XsltArgumentList argsList = new XsltArgumentList();
                    argsList.AddParam("SVG", "", "enabled");
                    argsList.AddParam("klucz", "", kluczPakietu);
                    argsList.AddParam("kod", "", kodPakietu);
                    XsltSettings xsltSettings = new XsltSettings();
                    xsltSettings.EnableDocumentFunction = true;
                    xsltSettings.EnableScript = true;

                    var transformer = new XslCompiledTransform();


                    XslCompiledTransform xslt = new XslCompiledTransform();
                    xslt.Load(xsltReader);

                    //here is exception
                    transformer.Load(xsltReader, xsltSettings, new XmlUrlResolver());
                    //transformer.Load(xsltReader);
                    using (XmlReader oldDocumentReader = oldDocument.CreateReader())
                    {
                        using (XmlWriter newDocumentWriter = newDocument.CreateWriter())
                        {
                            transformer.Transform(oldDocumentReader, argsList, newDocumentWriter);
                        }
                    }
                }
            }

            return newDocument.ToString();
        }

是否可以在 Blazor Webassembly 中完成?在 Blazor 服务器端,脚本有效。

标签: c#.netprogressive-web-appsblazorblazor-client-side

解决方案


XslCompiledTransform将尝试在运行时生成新的 .NET 代码,并期望 JIT 将其编译为底层机器的本机代码。由于 WebAssembly 不支持这一点(就像其他需要 AOT 的平台,如 iOS),你不能使用它。

在这些平台上使用XslTransform该类而不是XslCompiledTransform使用 XSLT。

更新:另请注意,XSLT 中的脚本始终需要生成运行时代码,因此即使XslCompiledTransform会退回到非编译转换,脚本目前仅用于生成运行时代码:

XslCompiledTransform 类支持使用 msxsl:script 元素的嵌入式脚本。加载样式表时,任何定义的函数都由代码文档对象模型 (CodeDOM) 编译为 Microsoft 中间语言 (MSIL) 并在运行时执行。从嵌入脚本块生成的程序集与为样式表生成的程序集是分开的。

资源


推荐阅读