Невозможно преобразовать XML-файл в html с помощью таблицы стилей XSLT

Клиентская сторона - реагировать js серверная часть - точка сети

XSLT-версия — 2.0

Привет, требуется преобразовать файл XML в файл html с помощью таблицы стилей XSLT для отображения пользователю на стороне клиента. Но проблема в том, что я не мог найти способ правильно преобразовать его.

Что я пробовал до сих пор,

  1. Попытался связать таблицу стилей с файлом xml и открыть ее в браузере, чтобы преобразование выполнялось браузером автоматически, но это не сработало должным образом. В хроме это просто пустое окно, а в фаерфоксе он отображает текст без стиля. Я также узнал, что браузеры по-прежнему не поддерживают преобразование xslt 2.0, поэтому я предполагаю, что проблема в этом.

---------------------- XML-данные-------------------------- ------

Выше показано, как я это связал. Пробовал как type="text/xslt", так и type="text/xsl".

  1. Пробовал преобразовывать на стороне сервера (.net 7/c#).

    Трансформация XslCompiledTransform = новая XslCompiledTransform(); использование (считыватель XmlReader = XmlReader.Create (новый StringReader (xsltString))) { Преобразовать.Загрузить(читатель); } Результаты StringWriter = новый StringWriter(); использование (считыватель XmlReader = XmlReader.Create (новый StringReader (inputXml))) { transform.Transform (читатель, ноль, результаты); } вернуть результаты.ToString();

Вышеупомянутый метод не дал никакой ошибки, но не дал содержимого в результирующем файле. Позже выяснилось, что XslCompiledTransform не поддерживает XSLT 2.0, поддерживает только 1.0. Поэтому я попробовал стороннюю библиотеку Саксон-ОН.

            var xslt = new FileInfo(@"E:\xmltesting\stylesheet-ubl.xslt");
            var input = new FileInfo(@"E:\xmltesting\invoice32.xml");
            var output = new FileInfo(@"E:\xmltesting\test.html");

            var processor = new Processor();
            var compiler = processor.NewXsltCompiler();
            var executable = compiler.Compile(new Uri(xslt.FullName));

            var destination = new DomDestination();
            using (var inputStream = input.OpenRead())
            {
                var transformer = executable.Load();
                transformer.SetInputStream(inputStream, new Uri(input.DirectoryName));
                transformer.Run(destination);
            }

            destination.XmlDocument.Save(output.FullName);

Вышеупомянутый метод дает исключение в нижней строке,

Var исполняемый = компилятор.Compile(новый Uri(xslt.FullName));

System.TypeInitializationException: «Инициализатор типа для «sun.util.calendar.ZoneInfoFile» вызвал исключение». Внутреннее исключение MissingMethodException: метод не найден: «Void System.IO.FileStream..ctor (System.String, System.IO.FileMode, System.Security.AccessControl.FileSystemRights, System.IO.FileShare, Int32, System.IO.FileOptions)» .

Не удалось найти многое, связанное с этим исключением.

  1. Поскольку преобразование со стороны сервера не выглядит многообещающим, банкомат вернулся к преобразованию на стороне клиента. В настоящее время я изучаю saxon-js... но все равно не повезло.

У кого-нибудь есть идея, как это сделать? Спасибо.

Какая именно версия Saxon-HE, используете ли вы ее с платформой .NET в Windows или пытаетесь использовать .NET 7 (ядро), и если да, то на какой платформе вы получаете это исключение?

Martin Honnen 14.02.2023 12:39

Кроме того, что касается попытки использовать Saxon-HE, вы получаете это исключение при любой попытке запустить через него XSLT 2 или только с вашим конкретным кодом XSLT?

Martin Honnen 14.02.2023 12:43

Версия @MartinHonnen Saxon-HE — 10.8.0, и я использую ее с платформой .NET 7 в Windows 10 и 11.

Thenura Illandara 14.02.2023 12:48

@MartinHonnen Я пробовал только с 1 таблицей стилей XSLT 2.0, которая необходима для преобразования xml в желаемый html.

Thenura Illandara 14.02.2023 12:50

Saxon HE 10 от Saxonica совместим с платформой Microsoft .NET, последней версией которой является 4.8. NET 7 — это не .NET framework, а последний (кроссплатформенный) выпуск .NET Core, мне немного интересно, как вам вообще удалось использовать пакет только .NET framework, такой как Saxon HE 10 с .NET 7. Что касается запуска таблицы стилей через Saxon HE 10.8 в Windows, прежде чем писать собственный код, пытались ли вы запустить его через командную строку Saxon HE .NET Transform.exe -s:input.xml -xsl:ubl.xslt, чтобы проверить, работает ли это?

Martin Honnen 14.02.2023 13:00

@MartinHonnen, о, я не знал, что это также выпуск .NET Core. Может быть, это проблема. Я пробовал с простым файлом xslt, он все еще дает то же исключение. Что касается пакета Saxen HE 10, я получил его от Nuget Packages в Visual Studio. Если он несовместим с .net 7, я не уверен, почему он доступен. В любом случае, я попробую код командной строки, который вы прислали. Спасибо.

Thenura Illandara 14.02.2023 13:21

Я до сих пор не понимаю, как вы получите исключение в этой строке, если вы действительно попытаетесь использовать пакет .NET framework Saxon 10 HE с .NET 7; Я попробовал сейчас, и хотя VS позволяет вам выбрать пакет, вы сразу получаете предупреждения, и любая попытка запустить код для меня уже дает исключение при любой попытке сделать, например. new Processor();.

Martin Honnen 14.02.2023 14:08

@MartinHonnen, да, странно, мой компилируется и успешно выполняется, пока не выдает исключение в этом месте.

Thenura Illandara 14.02.2023 15:20
Как сделать компонент справочного центра с помощью TailwindCSS
Как сделать компонент справочного центра с помощью TailwindCSS
Справочный центр - это веб-сайт, где клиенты могут найти ответы на свои вопросы и решения своих проблем. Созданный для решения многих распространенных...
Типы ввода HTML: Лучшие практики и советы
Типы ввода HTML: Лучшие практики и советы
HTML, или HyperText Markup Language , является стандартным языком разметки, используемым для создания веб-страниц. Типы ввода HTML - это различные...
Узнайте, как использовать теги <ul> и <li> для создания неупорядоченных списков в HTML
Узнайте, как использовать теги <ul> и <li> для создания неупорядоченных списков в HTML
HTML предоставляет множество тегов для структурирования и организации содержимого веб-страницы. Одним из наиболее часто используемых тегов для...
CSS Flex: что должен знать каждый разработчик
CSS Flex: что должен знать каждый разработчик
CSS Flex: что должен знать каждый разработчик Модуль flexbox, также известный как гибкий модуль разметки box, помогает эффективно проектировать и...
Введение в раздел &quot;Заголовок&quot; в HTML
Введение в раздел "Заголовок" в HTML
Говорят, что лучшее о человеке можно увидеть только изнутри, и это относится и к веб-страницам HTML! Причина, по которой некоторые веб-страницы не...
Как React Helmet спасает меня при разделении файлов CSS?
Как React Helmet спасает меня при разделении файлов CSS?
Многие новички могут столкнуться с проблемой, когда одна страница с CSS наследует свойства от другой страницы с другим CSS. У меня было много проблем,...
0
8
60
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Если вы хотите запускать таблицы стилей XSLT 2 или 3 с .NET 7, вы можете сделать это с помощью коммерческого пакета SaxonCS (https://www.nuget.org/packages/SaxonCS , последние версии 11.5 и 12.0) или с помощью кросс-компилированная версия Saxon HE 11.5 с помощью IKVM ( https://www.nuget.org/packages/SaxonHE11s9apiExtensions); ниже приведен код, использующий кросс-компилированный IKVM Saxon HE 11.5 в .NET 7:

using net.liberty_development.SaxonHE11s9apiExtensions;
using net.sf.saxon.s9api;

var processor = new Processor(false);

var xsltCompiler = processor.newXsltCompiler();

var xsltExecutable = xsltCompiler.Compile(new FileInfo("ubl.xslt"));

var xslt30Transformer = xsltExecutable.load30();

xslt30Transformer.Transform(new FileInfo("invoice-sample.xml"), processor.NewSerializer(new FileInfo("invoice-sample.html")));

Ответ Мартина показал вам варианты запуска преобразования на стороне сервера с использованием Saxon в .NET.

Но вы также спрашивали о возможностях выполнения преобразования на стороне клиента в браузере; для этого взгляните на SaxonJS.

Другие вопросы по теме