skip to Main Content

client side – react js
server side – dot net

XSLT version – 2.0

hi, requirement is to transform an XML file to a html file using an XSLT stylesheet to display to the user in the client side. But problem is I could not find a way to transform it properly.

What I tried so far,

  1. Tried linking the stylesheet in the xml file and opening it in the browser so that the transformation will be done by the browser automatically but this did not work as expected. In chrome it’s just a blank window and in firefox it displays the text with no styling. I also found out that browsers still do not support xslt 2.0 transformation so I assume that is the issue.

———————-xml data——————————–

Above shows how I linked it. Tried both type="text/xslt" and type="text/xsl".

  1. Tried transform in the server side (.net 7 /c#).

    XslCompiledTransform transform = new XslCompiledTransform();
    using(XmlReader reader = XmlReader.Create(new StringReader(xsltString))) {
    transform.Load(reader);
    }
    StringWriter results = new StringWriter();
    using(XmlReader reader = XmlReader.Create(new StringReader(inputXml))) {
    transform.Transform(reader, null, results);
    }
    return results.ToString();

Above method did not give any error but no content in the resulting file. Later found out that XslCompiledTransform does not support XSLT 2.0, it only supports 1.0. So I tried a 3rd party library
Saxon-HE.

            var xslt = new FileInfo(@"E:xmltestingstylesheet-ubl.xslt");
            var input = new FileInfo(@"E:xmltestinginvoice32.xml");
            var output = new FileInfo(@"E:xmltestingtest.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);

Above method gives exception at below line,

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

System.TypeInitializationException: ‘The type initializer for ‘sun.util.calendar.ZoneInfoFile’ threw an exception.’
Inner Exception
MissingMethodException: Method not found: ‘Void System.IO.FileStream..ctor(System.String, System.IO.FileMode, System.Security.AccessControl.FileSystemRights, System.IO.FileShare, Int32, System.IO.FileOptions)’.

Could not find much related to this exception.

  1. Since transforming from the server-side doesn’t look that promising atm moved back to client side transformation. I am currently looking into saxon-js…but still no luck.

Anyone have an idea on how to go about this?. Thanks.

2

Answers


  1. If you want to run XSLT 2 or 3 stylesheets with .NET 7 you can do so using the commercial SaxonCS package (https://www.nuget.org/packages/SaxonCS, latest versions are 11.5 and 12.0) or using the IKVM cross compiled version of Saxon HE 11.5 (https://www.nuget.org/packages/SaxonHE11s9apiExtensions); the following is code using the IKVM cross compiled Saxon HE 11.5 in .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")));
    
    Login or Signup to reply.
  2. Martin’s answer has shown you the options for running the transformation server-side using Saxon on .NET.

    But you also asked about the options for running the transformation client-side in the browser; for that, please take a look at SaxonJS.

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search