Клиентская сторона - реагировать js серверная часть - точка сети
XSLT-версия — 2.0
Привет, требуется преобразовать файл XML в файл html с помощью таблицы стилей XSLT для отображения пользователю на стороне клиента. Но проблема в том, что я не мог найти способ правильно преобразовать его.
Что я пробовал до сих пор,
---------------------- XML-данные-------------------------- ------
Выше показано, как я это связал. Пробовал как type="text/xslt", так и type="text/xsl".
Пробовал преобразовывать на стороне сервера (.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)» .
Не удалось найти многое, связанное с этим исключением.
У кого-нибудь есть идея, как это сделать? Спасибо.
Кроме того, что касается попытки использовать Saxon-HE, вы получаете это исключение при любой попытке запустить через него XSLT 2 или только с вашим конкретным кодом XSLT?
Версия @MartinHonnen Saxon-HE — 10.8.0, и я использую ее с платформой .NET 7 в Windows 10 и 11.
@MartinHonnen Я пробовал только с 1 таблицей стилей XSLT 2.0, которая необходима для преобразования xml в желаемый html.
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, чтобы проверить, работает ли это?
@MartinHonnen, о, я не знал, что это также выпуск .NET Core. Может быть, это проблема. Я пробовал с простым файлом xslt, он все еще дает то же исключение. Что касается пакета Saxen HE 10, я получил его от Nuget Packages в Visual Studio. Если он несовместим с .net 7, я не уверен, почему он доступен. В любом случае, я попробую код командной строки, который вы прислали. Спасибо.
Я до сих пор не понимаю, как вы получите исключение в этой строке, если вы действительно попытаетесь использовать пакет .NET framework Saxon 10 HE с .NET 7; Я попробовал сейчас, и хотя VS позволяет вам выбрать пакет, вы сразу получаете предупреждения, и любая попытка запустить код для меня уже дает исключение при любой попытке сделать, например. new Processor();.
@MartinHonnen, да, странно, мой компилируется и успешно выполняется, пока не выдает исключение в этом месте.
Если вы хотите запускать таблицы стилей 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.
Какая именно версия Saxon-HE, используете ли вы ее с платформой .NET в Windows или пытаетесь использовать .NET 7 (ядро), и если да, то на какой платформе вы получаете это исключение?