Проблема с Сериализатором для преобразования Xslt2.0 с Saxon - PullRequest
1 голос
/ 06 марта 2019

Это моя первая попытка запрограммировать преобразование Xslt2.0 с помощью SaxonHE 9.9 в C #, поэтому проблема заключается в том, что когда я создаю serilizer, я получаю сообщение об ошибке, что class Saxon.Api.Serializer не содержит конструктора с 0 аргументами.

Я знаю, что означает эта ошибка, но не знаю, почему она возникает, потому что каждый пример, который я вижу, создает сериализатор следующим образом. Этот вопрос звучит немного глупо, но я не могу найти ответ, чтобы заставить его работать.

using Saxon.Api;

namespace XY
{
    class Program
    {
        static void Main(string[] args)
        {            
            String SourceFilename = "./test/test.xml";
            String StylesheetFilename = "./scripte/xml-to-html.xsl";
            String OutputFilename = "./Output/test.html";

            using (FileStream streamXml = File.OpenRead(SourceFilename))
            {
                using (FileStream streamXsl = File.OpenRead(StylesheetFilename))
                {
                    Processor processor = new Processor();

                    DocumentBuilder builder = processor.NewDocumentBuilder();
                    Uri uri = new Uri("urn:test");
                    builder.BaseUri = uri;

                    XdmNode input = builder.Build(streamXml);
                    XsltTransformer transformer = processor.NewXsltCompiler().Compile(streamXsl).Load();

                    transformer.InitialContextNode = input;

                    Serializer serializer = new Serializer();
                    serializer.SetOutputFile(OutputFilename);
                    transformer.Run(serializer);
                }
            }

            Console.WriteLine("test.html created successfully");
        }
    }
}

EDIT

using System;
using Saxon.Api;
using System.IO;
using System.Reflection;

namespace XY
{
    class Program
    {
        static void Main(string[] args)
        {
            string currentDirectory = Directory.GetCurrentDirectory();

            String SourceFilename = ".\\test\\test.xml";
            String StylesheetFilename = ".\\scripte\\xml-to-html.xsl";
            String OutputFilename = ".\\Output\\result.html";

            if (StylesheetFilename.StartsWith(".\\"))
            {
                StylesheetFilename = System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + "\\" + StylesheetFilename;
            }

            if (SourceFilename.StartsWith(".\\"))
            {
                SourceFilename = System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + "\\" + SourceFilename;
            }

            var uri_source = new System.Uri(SourceFilename);
            var uri_xsl = new System.Uri(StylesheetFilename);


            Processor processor = new Processor();

            XdmNode input = processor.NewDocumentBuilder().Build(uri_source);

            processor.SetProperty("http://saxon.sf.net/feature/preferJaxpParser", "true");

            XsltCompiler compiler = processor.NewXsltCompiler();

            XsltExecutable executable = compiler.Compile(uri_xsl);

            XsltTransformer transformer = executable.Load();

            transformer.InitialContextNode = input;

            Serializer serializer = processor.NewSerializer();

            System.IO.StreamWriter stream = new StreamWriter(OutputFilename);

            serializer.SetOutputWriter(stream);

            transformer.Run(serializer);

            stream.Close();
        }
    }
}

Я изменяю также некоторые другие мысли, и теперь это работает, спасибо за ответы.

Ответы [ 2 ]

0 голосов
/ 06 марта 2019

Я сообщу об ошибке в связи с тем, что есть примеры приложений и / или документации, которые используют форму "new Serializer ()".

Мы исключили это из продукта Java в 9.8, потому что это вызывало постоянные проблемы с тем, что Serializer не (обязательно) не имеет доступа ко всем параметрам конфигурации (хранится в процессоре); также использование фабричного метода Processor.newSerializer() потенциально позволяет нам создать подкласс Serializer, что делает его более гибким. Затем мы следовали этому шаблону в .NET в выпуске 9.9, отчасти по тем же причинам и отчасти потому, что API .NET теперь переписан как очень тонкий слой поверх Java API, что помогает нам поддерживать общность, и упрощает тестирование.

Мы стараемся поддерживать обратную совместимость в основных API-интерфейсах продукта, но это не требование, которое отменяет все остальные; если мы чувствуем, что у нас что-то не так, мы исправляем это. Как говорят некоторые люди, чтобы оправдать политику, «будущее длиннее прошлого».

СПУСТЯ

Мы провели некоторую проверку и считаем, что документация 9.9 и примеры приложений верны; Вы должны использовать более старую версию. Если я ошибаюсь, укажите конкретное место, где вы нашли неверную информацию.

0 голосов
/ 06 марта 2019

В 9.9 вы можете (или действительно должны) создать Serializer с различными перегрузками processor.NewSerializer (см. http://saxonica.com/html/documentation/dotnetdoc/Saxon/Api/Processor.html#NewSerializer(Stream))..

...