XML Calabash & Saxon 9.8

Volume 2, Issue 4; 25 Jan 2018

Making XML Calabash (1.1!) work with Saxon 9.8.

In the past few weeks, several folks have requested a version of XML Calabash 1.1 that works with Saxon 9.8. I confess I hadn’t given that upgrade a lot of thought. I’m using Saxon 9.8 in my nascent XProc 3.0 implementation, but that’s still pre-release quality.

It turns out, if you take the XML Calabash 1.1.16 jars and throw Saxon 9.8 at them, it ain’t pretty. It doesn’t run. It doesn’t even compile because of underlying API changes.

Thankfully, Saxonica haven’t changed that much. It only took half an hour or so and a little poking about in the docs to make it compile.

And then I ran the tests. So. Much. Red. About 400 of the tests that I run in junit for sanity checking purposes failed. On further inspection, I decided that two issues were responsible for almost all the failures: missing namespaces and a “system IDs are immutable” error.

It turned out that my tree builder included an explicit use of NamespaceReducer. The namespace reducer, as its name suggests, reduces namespaces. In fact, it discards all “unused” ones. At least, that’s what it does in Saxon 9.8. In earlier releases of Saxon, it appears not to do that. I don’t recall why I added it. XML Calabash cavalierly ignores the “no user servicable parts inside” warnings on various bits of Saxon, unscrews all the tamperproof screws, and takes those covers right off. I’ve cut myself on sharp edges once or twice. The namespace reducer is, I expect, an artifact of some attempt to fix something nasty. Hypothesis: it’s unnecessary and harmless in earlier releases.

I’m much less sanguine about the system IDs issue. XML Calabash attempts to preserve the base URI of documents that flow through XSLT. It does this by setting the system identifier on the resulting document:


Except that’s an error in Saxon 9.8. Possibly not unreasonably so. I really don’t know how significant this is. In the short term, I simply removed it. That doesn’t cause any tests in the test suite to fail, but that may be more a reflection of the test suite than the feature.

It could very well be that some pipelines will have problems because documents have lost their base URI. (Short, concrete test cases that demonstrate this bug, if it is one, would be appreciated.)

Those two changes fixed all but two of the failing tests.

One of the two remaining tests is an explicit check for a “2.0” processor. Saxon 9.8 reports that it’s a 3.0 processor so, you know, fair play. I fixed that test to check for a “3.0” processor.

The other test was checking that attempting to match on a namespace node was an error. I was relying on Saxon to object, but it isn’t an error in XSLT 3.0, so it doesn’t. I just commented that test out.

That took care of all the obvious errors. Along the way, I also replaced some deprecated methods for setting whitespace stripping.

TL;DR: you can get an EXPERIMENTAL release of XML Calabash 1.1.16 for Saxon 9.8 from github or Maven. It appears to pass the test suite reasonably well, but I will not be surprised if there are problems, especially in pipelines that care about the base URI of transformed documents.

If you try it, I would like to know if you have problems or not.

If you go sticking it into production, well…your gun, your bullet, your foot.

I will try to be responsive to error reports. I am committed to trying to make it work as well as XML Calabash 1.1.16 works with earlier Saxon releases.

Note: you should consider this the EOL announcement for Saxon 9.6 support. If that's a problem, y'all let me know.