Передайте xml и xsl как строку для обработки в xslt 3 - PullRequest
0 голосов
/ 04 июля 2018

Я конвертирую xml в html, используя библиотеку xslt 3.0 saxon-HE 9.8. Используя его в коде c #.

Я передаю путь файла xml и xslt на входе, чтобы преобразовать его и получить вывод.

Может кто-нибудь, пожалуйста, дайте мне знать, как я могу передать xml как строку и xslt как строку как ввод в коде c # для его обработки.

Ниже мой код.

public static string Transform_XML(string param, string inputfile, string xsltfilename)
    {
        var xslt = new FileInfo(xsltfilename);
        var input = new FileInfo(inputfile);

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

        XPathDocument doc = new XPathDocument(new StringReader(param));
        DocumentBuilder db = processor.NewDocumentBuilder();
        XdmNode xml;
        using (XmlReader xr = XmlReader.Create(new StringReader(param)))
        {
            xml = db.Build(xr);
        }

        // Do transformation to a destination
        var destination = new DomDestination();
        using (var inputStream = input.OpenRead())
        {
            var transformer = executable.Load();
            transformer.SetParameter(new QName("", "", "user_entry"), xml);
            transformer.SetInputStream(inputStream, new Uri(input.DirectoryName));
            transformer.Run(destination);
        }

        return destination.XmlDocument.InnerXml.ToString();
    }

Хотите передать xml и xslt в виде строки вместо пути к файлу.

ОБНОВЛЕНИЕ 1

Получил решение для передачи xml и xsl в виде строки в c #. Ниже обновленный код.

private string Transform_XML(string param, string param_name, string inputfile, string xsltfilename)
    {
        string xslt_input = System.IO.File.ReadAllText(xsltfilename + ".xslt");
        string xml_input = System.IO.File.ReadAllText(inputfile + ".xml");

        // Compile stylesheet
        var processor = new Processor();
        var compiler = processor.NewXsltCompiler();
        compiler.BaseUri=new Uri(Server.MapPath("/"));
        var executable = compiler.Compile(new XmlTextReader(new StringReader(xslt_input)));

        XPathDocument doc = new XPathDocument(new StringReader(param));
        DocumentBuilder db = processor.NewDocumentBuilder();
        XdmNode xml;
        using (XmlReader xr = XmlReader.Create(new StringReader(param)))
        {
            xml = db.Build(xr);
        }

        //xml input
        DocumentBuilder builder = processor.NewDocumentBuilder();
        builder.BaseUri= new Uri(Server.MapPath("/"));
        MemoryStream ms = new MemoryStream();
        StreamWriter tw = new StreamWriter(ms);
        tw.Write(xml_input);
        tw.Flush();
        Stream instr = new MemoryStream(ms.GetBuffer(), 0, (int)ms.Length);
        XdmNode input = builder.Build(instr);

        // Do transformation to a destination
        var destination = new DomDestination();
        var transformer = executable.Load();

        //Set the parameter with xml value
        transformer.SetParameter(new QName("", "", param_name), xml);

        // Set the root node of the source document to be the initial context node
        transformer.InitialContextNode = input;
        transformer.Run(destination);

        // Get result 
        return destination.XmlDocument.InnerXml.ToString();
    }

1 Ответ

0 голосов
/ 04 июля 2018

У XsltTransformer есть метод SetInputStream(), который позволяет вам передавать входные данные в виде потока (который, по-видимому, вы действительно используете).

Эта запись Как создать поток из строки? рассказывает, как создать поток из строки.

...