XSLT 2.0

by Bernhard Wurm 21. May 2010 18:57

Visual Studio hat eigentlich einen tollen XSLT Support, wie die folgenden zwei Punkte belegen:

  1. Intellisence
    Jeder Programmierer kennt es und jeder liebt es. Auch für XSLT gibt es Intellisence, auch wenn es lediglich das normale Intellisence ist, welches für XML-Dateien verfügbar ist, sobald ein Schema angegeben wird, aber was will man mehr?
    Das zugehörige Schema liegt übrigends unter C:\Program Files (x86)\Microsoft Visual Studio 10.0\Xml\Schemas\xslt.xsd
  2. Debugging
    Jeder Fehler wird sofort angezeigt und das XSLT kann im Debug-Modus schrittweise ausgeführt werden, wodurch die Fehlersuche erleichtert wird. Bei so manchen Fehlern ist auch dies ein echt super Feature!

Um so mehr ist es ernüchternd, wenn XSLT2.0 Features benötigt werden. Ab diesem Zeitpunkt versagt jegliche Unterstützung :-(

Folgendes Szenario: Aufgrund einer XML-Datei sollen mehrere XML- oder HTML-Dateien generiert werden. Ab diesem Zeitpunkt ist XSLT 2.0 notwendig: <xsl:result-document>

Die Konsequenz aus dieser Problematik ist, dass keinerlei Support von Visual Studio (auch nicht VS 2010) verfügbar ist, weder im Bereich Intellisence, noch im Bereich der Ausführung.

Wie also mithilfe von XSLT 2.0 Dateien transformieren? Saxon.NET hilft dabei. Mit wenigen Zeilen .NET-Code oder auch per Commandline lassen sich damit die Datei transformieren; auch wenn das Debugging schwer vermisst wird!

Der Code für die Verwendung ist relativ simple, doch damit nicht lange gesucht werden muss, hier eine Abwandlung von Terry’s Worklog-Blog veröffentlichen Code:

Processor processor = new Processor();
using (System.IO.StreamReader reader = new System.IO.StreamReader(XmlFile, System.Text.Encoding.UTF8)) {
    using (System.IO.TextWriter stringWriter = new System.IO.StringWriter()) {
        stringWriter.Write(reader.ReadToEnd());
        stringWriter.Close();

        reader.Close();

        using (System.IO.TextReader stringReader = new System.IO.StringReader(stringWriter.ToString())) {
            using (System.Xml.XmlTextReader reader2 = new System.Xml.XmlTextReader(stringReader)) {
                reader2.XmlResolver = null;

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

                // Create a transformer for the stylesheet.
                XsltTransformer transformer = processor.NewXsltCompiler().Compile(new System.Uri(Xslt2File)).Load();
                transformer.InputXmlResolver = null;

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

                Serializer serializer = new Serializer();
                serializer.SetOutputFile(“c:\\myfile.xml”);

                // Do the xslt transformation
                transformer.Run(serializer);
            }
        }
    }
}

Tags: , ,
Categories: Visual Studio