# Saxon on .NET

Saxon on .NET is now built using IKVM 0.40. However, the OpenJDK Classpath library has been customised to reduce its size, by removing parts that Saxon does not need.

The Saxon DLL file now contains a cross-compiled copy of the Apache Xerces-J XML parser. The Sun fork of Xerces (which is part of the standard OpenJDK) is not included. Xerces is now the preferred XML parser; to use the Microsoft System.Xml parser instead, set the configuration option `PREFER_JAXP_PARSER` to false, or use Saxon API interfaces that take an `XmlReader` as an explicit argument. When a `DocumentBuilder` is used, the supplied `XmlResolver` will be used to dereference external entity references whichever parser is used.

Interfaces that take an `XmlReader` as an argument (for compiling a stylesheet or a schema) now use that `XmlReader` without modification: they no longer wrap a supplied `XmlTextReader` in an `XmlValidatingReader`, as these classes have been deprecated since .NET 2.0. It is therefore the user's responsibility to supply a correctly-configured `XmlReader`.

Saxon now uses the regular expression library provided in OpenJDK in preference to the .NET regular expression library. This avoids the need to maintain two copies of very similar code in Saxon, and it takes advantage of the Java regex handling of high Unicode characters.

The `XPathCompiler` has a new option to permit undeclared variables in XPath expressions. This allows an expression to be compiled without pre-declaring the variables that it references. It is possible to discover what variables are used in the expression (so that they can be initialized) by means of new methods provided on the `XPathExecutable` object.

The class `XdmValue` has a new method `Append()` allowing a new `XdmValue` to be constructed by concatenating two existing instances of `XdmValue`.

The `Processor` object is now accessible to the code of extension functions by calling `context.getConfiguration().getProcessor()`, assuming that the method in question has a first argument of type `net.sf.saxon.expr.XPathContext`. This is useful when the extension function wants to create new nodes or invoke Saxon operations such as XSLT or XQuery processing.

The `XdmDestination` object now has a `TreeModel` property, allowing a query or transformation result to be written to a LinkedTree, which makes it amenable to processing using XQuery Update.

A number of classes have been added to the API to represent types (notably `XdmSequenceType` and `XdmItemType` with subtypes such as `XdmAtomicType`). These were introduced primarily to support the new class `ExtensionFunction` which provides a way of implementing extension functions that does not rely on dynamic loading, and that can take advantage of information in the static and dynamic context. Instances of `ExtensionFunction` can be registered with the `Processor`.

Next