Blazor - элемент 'msxsl: script' не поддерживается в этой платформе, поскольку он не поддерживает генерацию кода времени выполнения - PullRequest
0 голосов
/ 06 августа 2020

У меня проблема с использованием XslCompiledTransform в Blazor Webassembly.

blazor.webassembly. js: 1 крит: Microsoft.AspNetCore.Components.WebAssembly.Rendering.WebAssemblyRenderer [100] Необработанное исключение Компонент рендеринга: элемент 'msxsl: script' не поддерживается в этой структуре, поскольку он не поддерживает генерацию кода времени выполнения

Ошибка в консоли google chrome

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 скрипт работает.

1 Ответ

2 голосов
/ 10 августа 2020

XslCompiledTransform попытается сгенерировать новый. NET код во время выполнения и будет ожидать, что JIT скомпилирует его в машинный код для базовой машины. Поскольку WebAssembly не поддерживает это (как и другие платформы, требующие AOT, например iOS), вы не можете его использовать.

Используйте класс XslTransform вместо XslCompiledTransform для работы с XSLT на этих платформах.

Обновление: также обратите внимание, что скрипты внутри XSLT всегда нуждаются в генерации кода во время выполнения, поэтому даже если XslCompiledTransform вернется к некомпилированному преобразованию, скрипты в настоящий момент реализуются только для генерации кода во время выполнения. :

Класс XslCompiledTransform поддерживает встроенные сценарии с использованием элемента msxsl: script. Когда таблица стилей загружена, любые определенные функции компилируются в промежуточный язык Microsoft (MSIL) с помощью объектной модели документа кода (CodeDOM) и выполняются во время выполнения. Сборка, созданная из встроенного блока скрипта, отличается от сборки, созданной для таблицы стилей.

Source

...