The Saxon 12.10 maintenance release has been published. This is a maintenance release for Java, C#, C/C++, PHP, and Python that fixes a number of issues that have been raised since 12.9 was released.
Saxon 12.10 was released on 10 July 2026. This release has been uploaded to the usual locations on the Saxonica website, GitHub, and Maven, PyPi, and NuGet. SaxonCS 12.10 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.
- SaxonC releases for HE, PE, and EE are also available from our download pages.
- 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.
Issues resolved in SaxonJ and SaxonCS
This release fixes about thirty issues in SaxonJ and SaxonCS.
- 7143 The random-number-generator() is not really deterministic if a BigDecimal is part of the seed
- 7140 Incorrect result from bin:shift()
- 7139 Streamed grouping raises null pointer exception
- 7138 Setting allowedProtocols to the empty string in a configuration xml file has no effect (use #none instead)
- 7135 Unreported type error in general comparison
- 7134 Cannot set allowedProtocols from the Transform and Query CLI.
- 7128 Error with XInclude enabled
- 7096 Try/Catch tests failing in XQuery push mode
- 7088 URIQualifiedName rejected for named function reference when local name is reserved
- 7083 Try/Catch works incorrectly if optimization is disabled
- 7079 When a schema is exported to an SCM file and reloaded, the order of member types of a union is lost
- 7071 java.lang.NegativeArraySizeException when serializing large primary result of transform()
- 7070 Changes in the results of float to integer conversion
- 7059 Incorrect caching of schema conversion rules
- 7056 Problem with copy() applied to a user-defined instance of JavaExtensionFunctionCall
- 7040 Exception with invalid match pattern syntax
- 7037 Empty result document with xsl:result-document (no href given) when matching the top-level element in a declared mode
- 7035 Performance problem for maps with numeric keys
- 7034 Make sure column numbers are preserved correctly
- 7024 Implement saxon:internal-dtd-subset
- 7010 ResolveURI.escapeSpaces is vulnerable to stack overflow
- 7004 Parsing JSON doesn't always count lines correctly.
- 7002 xs:anySimpleType('x') causes a class cast exception
- 6997 NullPointer exception when using fragment identifiers in stylesheet URIs
- 6985 Type check for processing instruction named by as attribute
- 6978 NullPointerException thrown for null parameter to unparsed-text
- 6969 serialize(method=json) writes the value 0 as 0.0E1
- 6932 Support for XPath 2.0
- 6923 Saxon-HE class StandardErrorReporter can throw null pointer exception
- 6918 XQuery "validate type xs:untyped" should remove type annotations
- 6910 Incorrect type inference for schema-element(N)
- 6872 NPE when attempting to compile a recursive xsd
- 6857 Saxon does not stop when listener warning throws
- 6815 The -TP option under SaxonCS
An additional three bugs are specific to SaxonCS:
- 7144 Format-number() does not respect picture if it ends with '#'
- 7142 Incorrectly parsed numeric values when culture defines “,” as the decimal separator
- 6833 Absolute file URL file:///app/identity.xsl fails with SaxonCS
Issues in SaxonC
This release fixes about ten issues in SaxonC:
- 7113 Failed to build SaxonC PHP extension: no rule to make target php8_saxon.cpp
- 7086 fix _getResourceDirectory
- 7085 XdmFunctionItem operator=
- 7072 TypeError: expected bytes, str found in PyXQueryProcessor.set_cwd when None passed in
- 7041 SaxonApiException after X Saxon\XsltExecutable::transformFileToString
- 6964 PyXPathProcessor.get_property() expects bytes instead of str
- 6936 Some PHP extension code is failing to compile on Alpine Linux aarch64
- 6921 Comparison for unsigned integer incorrect
- 6919 XdmMap::containsKey incorrect check
- 6875 On debug run, Python program using SaxonC runs through to output but then gives lots of errors
- 5561 Misleading error message on failure to find external DTD
If you encounter any issues with Saxon 12.10, please report them on our issue tracker.