The Saxon 12.6 maintenance release has been published. This is a maintenance release for Java, C#, C/C++, PHP, and Python that addresses well over 100 issues and feature requests reported since the Saxon 12.5 release.
Saxon 12.6 was released on 2 May 2025. This release has been uploaded to the usual locations on the Saxonica website, GitHub, and Maven, PyPi, and NuGet. SaxonCS 12.6 is built with .NET 8.
For a list of the issues resolved in this release, please visit the issue trackers for SaxonJ and SaxonCS or SaxonC on the Saxon support site.
Download products:
- Binaries for PE and EE are available from our download pages.
- SaxonJ-HE is available on the Maven Central repository.
- SaxonJ-HE, PE, and EE can also be found on our experimental Maven repository.
- Python wheels for SaxonC (HE, PE, and EE) are available from PyPI.
- SaxonCS is available on NuGet
- Saxon-HE is available from our open source GitHub repository. The GitHub repository also provides source code for those who need it.
For more details, please consult the documentation.
Partial list of issues resolved
This section is a subset of the complete list of resolved issues. It’s curated to bring attention to the bugs that seem most likely to impact customers.
Issues in SaxonJ and SaxonCS
In addition to the individual issues listed below, this release fixes several issues related to streaming transformations and several issues related to tracing.
For a full list, see the issue tracker.
- 6748 Updated xsl:array to track the evolving QT4CG specifications
- 6746 Resolved errors related to version ranges in xsl:use-package/@package-version
- 6724 Clarified limitations on importing schemas for reserved namespaces (such as fn:)
- 6711 Clarified how setting allowedProtocols to restrict parse-xml is handled
- 6696 Resolved a concurrency issue during lazy evaluation
- 6688 Fixed a bug where the coverage report from XSpec creates XML that is not well formed
- 6682 Resolved an issue in XSD uniqueness constraints vs. key constraints
- 6679 Fixed a bug where an incorrect variable was accessed when using xsl:iterate within xsl:accumulator
- 6671 Resolved an issue during schema load with multiple imports
- 6652 parse-xml no longer fails if the string it’s parsing begins with a BOM
- 6621 Clarified how reflexive extension functions and varargs work
- 6597 Fixed a bug where calling getBaseUri() in the Axiom tree model triggers infinite recursion
- 6577 Resolved an issue related to xsl:where-populated and namespace fixup
- 6565 Fixed a performance regression in DocumentFn with Java 12 or higher
- 6544 Fixed a bug where ID/IDREF attributes were not recognized when using the StAX parser
- 6543 Fixed a bug where whitespace text nodes were reported incorrectly when using a pull parser
- 6537 Fixed incorrect rounding of negative xs:double values
- 6504 Clarified how collection() and uri-collection() handle invalid URIs
- 6502 Fixed a bug where several invalid patterns were accepted
- 6494 Fixed a bug where whitespace text output disappeared when indenting
- 6489 Fixed Gizmo issue with prefix, precede, suffix, and follow commands
- 6480 Cardinality of sequences returned by extension functions are now validated
- 6472 Fixed a bug related to sort order in xsl:for-each-group in named templates
- 6471 Corrected the operator precedence of validate expressions
- 6452 Fixed round#2 and round-half-to-even#2 to give correct results on large negative integers
Issues in SaxonC
In the SaxonC 12.6 release, we have included a compiled C++ API library (.dll, .so, .dylib as appropriate) along with accompanying CMake files to simplify integration into C++ applications. This is provided in addition to the core SaxonC library, which continues to be cross-compiled using GraalVM.
To use SaxonC in a C++ project, users now only need the two compiled library files and the header files—greatly reducing setup complexity. Integrating with a project already using CMake is as simple as using FindPackage(SaxonCHE 12.6.0) (Or SaxonCEE, or SaxonCPE, if using the EE or PE editions). A sample CMake project is provided with the samples in the download ZIP.
This change applies only to the C++ API. It does not affect the PHP or Python extensions:
- PHP
- Installation instructions are included in the README file in the download ZIP and also available in the online documentation.
- Python
- The extension is distributed as pre-built wheels via PyPI, making installation straightforward using pip.
In addition to the individual issues listed below, this release fixes a number of multithreading issues, encoding problems, and memory leaks. API support has been added for getcwd, getProperty/getProperties, and getJustInTimeCompilation on several objects. There have also been a number of documentation improvements.
For a full list, see the issue tracker.
- 6731 Support adding properties to the Processor in the Saxon C API
- 6695 Fixed an issue related to creating maps of strings in Python
- 6677 Improve error messages associated with Xslt30Processor::compileFromString
- 6676 Support initial template invocation with a combination of tunnel and non-tunnel parameters
- 6668 Support setOutputFile() on SchemaValidator
- 6657 Fixed line and column numbers in PySaxonApiError message
- 6656 Fixed a bug where multiple calls to XdmNode.getParent() could leads to an exception
- 6649 Improved error message associated with an expired license
- 6634 Added support for getcwd and getProperties
- 6628 Fixed a bug where the copy constructor for Xdm objects failed
- 6620 Fixed a double-free bug in clearSettings
- 6619 Resolved missing calls to super constructors
- 6618 Fixed a bug where getDoubleValue crashed for text strings in XdmAtomicValue class
- 6615 Fixed a bug where isEmpty crashed for new empty XdmMap
- 6614 Fixed a bug where the XdmValue::XdmValue constructor crashed
- 6606 Fixed a bug related to cwd and static-base-uri() in XPath
- 6605 Fixed a bug in static-base-uri() when compiling a query from a string
- 6575 Resolved a bug where som exception messages were empty in the PHP API
- 6573 Added isMap, isArray and isFunction methods to the PHP API
- 6562 Fixed issues related to mapSize when casting XdmValue from parseJson to XdmMap
- 6556 Fixed a bug where the standardErrorOutputFile feature was ignored
- 6539 Support PyXdmMap and PyXdmArray on PySaxonProcessor.parse_json
- 6475 Fixed a bug where the PySchemaValidator did not handle an XdmNode input correctly
If you encounter any issues with Saxon 12.6, please report them on our issue tracker.