Saxonica: SaxonJS release notes

SaxonJS release notes

Maintenance release 2.6

13 October 2023

Bug fixing maintenance release.

For use with SaxonJS 2, SEFs must be produced with Saxon-EE 10.0 or later, or compiled using the internal compiler in SaxonJS 2 on Node.js.

If using Saxon-EE 11, please use 11.3 or later, as a number of bugs in compiling to SEF were fixed in the 11.3 maintenance release.

Changes

See the Change history section of the documentation for full details.

Bug fixes

  • Bug #5597: ixsl:schedule-action fails without xsl:call-template
  • Bug #5713: ixsl:source() from asynchronous transform with no source document
  • Bug #5714: Update documentation to mention the backtick escaping mechanism for all the effected functions
  • Bug #5739: Space in string in text template not output as element content
  • Bug #5761: fn:transform called from XPath with simplified stylesheet gives error XTTE0590 in XSLT-SEF-compiler.xsl
  • Bug #5855: map:merge with duplicates=combine gives wrong answer
  • Bug #5925: Performance: dynamic function lookup runs very slowly under Saxon-JS
  • Bug #5974: SaxonJS documentation does not address namespaces
  • Bug #6037: ixsl:schedule-action return objects
  • Bug #6096: XSLT 3 with accumulator-rule match pattern using variables in predicate causes Internal error
  • Bug #6107: Can't use namespaced attributes on the root element of the body of a SaxonJS http-request
  • Bug #6134: Partial function application call to function in ixsl namespace fails
  • Feature #6216: base-uri() value empty for documents async-loaded with ixsl:schedule-action/@http-request
  • Bug #6219: base-uri(ixsl:page()) returns empty value

Maintenance release 2.5

4 October 2022

Bug fixing maintenance release.

For use with SaxonJS 2, SEFs must be produced with Saxon-EE 10.0 or later, or compiled using the internal compiler in SaxonJS 2 on Node.js.

If using Saxon-EE 11, please use 11.3 or later, as a number of bugs in compiling to SEF were fixed in the 11.3 maintenance release.

Changes

See the Change history section of the documentation for full details.

Bug fixes

  • Bug #4704: parse-xml fails in browser on string that has XML declaration in CDATA section
  • Feature #5083: Saxon-JS in the browser should support data: and blob: URLs
  • Bug #5389: Test case attribute-1301 fails
  • Bug #5490: Saxon-JS 2.4 fails to run Schxslt pipeline XSLT
  • Bug #5493: Problems with transform result output.resultDocuments
  • Bug #5494: Properties of attribute nodes have internal names which change from one release to another
  • Bug #5544: Using the SaxonJS.transform logLevel option sets the log level globally
  • Bug #5554: Some initialization errors for asynchronous transforms are not handled correctly
  • Bug #5560: intersect doesn't seem to work correctly for attributes
  • Bug #5563: SaxonJS allows elements in supposedly empty xsl:copy-of instruction
  • Bug #5597: ixsl:schedule-action fails without xsl:call-template
  • Bug #5653: In xsl:where-populated, an empty array is not "deemed empty" for the purposes of this instruction
  • Bug #5662: Uncaught TypeError: this.al is not a function in today's XPathle when using the "use stats" button
  • Bug #5667: ixsl:eval argument starting with a newline fails to evaluate
  • Bug #5673: ixsl:set-property and URLs in property names
  • Bug #5677: Required cardinality of first argument of t:commonType() is one or more; supplied value is empty
  • Bug #5695: Unexpected sort order in Firefox
  • Bug #5698: Changes for system-property()

Maintenance release 2.4

12 May 2022

Bug fixing maintenance release.

For use with SaxonJS 2, SEFs must be produced with Saxon-EE 10.0 or later, or compiled using the internal compiler in SaxonJS 2 on Node.js.

If using Saxon-EE 11, please use 11.3 or later, as a number of bugs in compiling to SEF were fixed in the 11.3 maintenance release.

Changes

See the Change history section of the documentation for full details.

Bug fixes

  • Bug #4755: Pattern x/(a|b) is rejected
  • Bug #5036: key() doesn't work on ixsl:page() after ixsl:replace-content?
  • Bug #5039: Chaining two XSLTs where the first creates a fragment with two element children works under Node.js but not in the browser
  • Bug #5042: xslt3 fails to identify that function with type declaration as="element()" returns an empty sequence
  • Bug #5066: Element.localName is not implemented in saxon-js 2.3
  • Bug #5074: "XML Parsing Error" when loading SEF file with Saxon-JS 2.3
  • Bug #5079: resolve-uri doesn't take static-base-uri of included module into account, even with relocate:off Saxon EE compiled/exported XSLT
  • Bug #5081: Result of serialize($someElement, map{}) contains XML declaration although function spec suggest default value is to omit-xml-declaration
  • Bug #5132: Misleading error message
  • Bug #5162: Failure when using collations in SaxonJS.XPath.evaluate
  • Bug #5190: xsl:iterate problem where the name of an xsl:iterate parameter duplicates the name of a local variable
  • Bug #5193: $nodes => fold-left((), function($all, $this) {$all, $this except $all}) call gives error "Supplied value element <a> does not match required type xs:error in dynamic call of anonymous function (arity 2)"
  • Bug #5198: NodeJS run from command-line with '-it:main' arg results in error when using mode="#current"
  • Bug #5230: Difficulty using xsl:xpath-default-namespace in conjunction with the key attribute of xsl:map-entry
  • Bug #5338: XX Compiler reports "Unknown accumulator NNNNN" when an accumulator-before or -after call occurs in a global variable
  • Bug #5387: Adaptive serialization only escapes the first quotation mark in a string
  • Bug #5389: Test case attribute-1301 fails
  • Bug #5390: document() doesn't remove duplicates
  • Bug #5391: fn:snapshot applied to namespace and attribute nodes
  • Bug #5407: XX compiler outputs its own location on an error
  • Bug #5408: Test case message-0312 fails (with either compiler)
  • Bug #5409: xsl:message document is not available as $err:value
  • Bug #5413: Test case accept-0903 crashes (when compiled with XJ)
  • Bug #5414: Saxon-JS 2.3 doesn't reject xsl:map-entry key="()"
  • Bug #5419: XX compiler version message is wrong
  • Bug #5430: Use of deliverResultDocument in SaxonJS.transform options causes error "Unsupported result-document destination undefined"
  • Bug #5458: Trying to replace contents of HTML document's root element html with xsl:result-document href="?." method="ixsl:replace-content" creates or leaves duplicated/empty head/body elements
  • Feature #5462: Add "-relocate" command line option for XX compiler (xslt3 package)
  • Bug #5464: unparsed-text() with an empty file throws a TypeError
  • Bug #5471: Results object from asynchronous SaxonJS.transform does not contain stylesheetInternal

Maintenance release 2.3

20 August 2021

Bug fixing maintenance release.

For use with Saxon-JS 2, SEFs must be produced with Saxon-EE 10.0 or later, or compiled using the internal compiler in Saxon-JS 2 on Node.js.

Changes

See the Change history section of the documentation for full details.

Bug fixes

  • Feature #4748: Option to supply Accept header in SaxonJS.getResource()
  • Bug #5008: SaxonJS: Import XSLT2 from XSLT2 error
  • Bug #5010: Static base URI missing trailing slash for -xp command line option
  • Bug #5017: Fix Accept header value sent by document()
  • Bug #5019: Invalid local name: 'xml:lang'
  • Feature #5021: Option to supply base URI of the source text in SaxonJS.getResource() for Node.js
  • Bug #5024: XSLT 3 main module with expand-text="yes" sets that too for imported XSLT 2 module
  • Bug #5031: ixsl:set-property: ... not found for supplied object
  • Bug #5037: empty AVT causes error "Cannot read property 'value' of null"
  • Bug #5038: Getting error XTTE0590 'Required cardinality of value of parameter $stylesheet-base-uri is exactly one; supplied value is empty' when calling fn:transform with stylesheet-node created from fn:parse-xml
  • Bug #5046: Handling null and undefined objects in ixsl:get() and ixsl:set-property
  • Bug #5058: Document.createElementNS not implemented in saxon-js 2.2

Maintenance release 2.2

11 May 2021

Bug fixing maintenance release.

For use with Saxon-JS 2, SEFs must be produced with Saxon-EE 10.0 or later, or compiled using the internal compiler in Saxon-JS 2 on Node.js.

Changes

See the Change history section of the documentation for full details.

The most significant change in this release is that Saxon-JS running on Node.js no longer creates a “SaxonJS” global object. This has two consequences:

  1. Saxon-JS works better in environments where the global object space is managed more strictly. In particular, it will work with Electron (see bug 4639) and tools like Webpack (bug 4669).
  2. If your Node.js application relies on the implicit creation of the SaxonJS global object, you will need to make a few minor changes to your application.

Bug fixes

  • Bug #4639: SaxonJS in Electron appears non-standard
  • Bug #4641: xpath-default-namespace not being honoured on ixsl:*/@object
  • Bug #4669: SaxonJS object is empty using Webpack
  • Bug #4768: fn:transform(): source-node and global context item
  • Bug #4913: Documentation/code discrepancy in regex flag for using the JavaScript RE engine
  • Bug #4923: The -xp option on xslt3.js should also support -json
  • Bug #4925: The -s option resolves spaces incorrectly in filenames
  • Bug #4958: saxon-js 2.1: Crash in Saxon.XPath.evaluate with certain predicates
  • Bug #4963: Missing namespace prefix in imported stylesheet is not detected
  • Bug #4978: a.ha is not a function

Maintenance release 2.1

2 March 2021

Bug fixing maintenance release.

For use with Saxon-JS 2, SEFs must be produced with Saxon-EE 10.0 or later, or compiled using the internal compiler in Saxon-JS 2 on Node.js.

Changes

See the Change history section of the documentation for full details.

The following new features have been added:

  • In the SaxonJS.transform() API, it is now possible to supply the principal input as a JSON document, rather than an XML document. The new option, sourceType, should be used to indicate that the supplied source is JSON.
  • Correspondingly, on Node.js, the command line option -json has been added as an alternative to -s. It allows the principal input to be a JSON document.
  • On Node.js, the -xp command line option has been added somewhat experimentally to allow an XPath expression to be evaluated directly over an XML document.
  • On the browser, the set of Window events that an XSLT event handler can respond to has been extended to include the resize and focus events (see also bug #4728.)

Bug fixes

  • Bug #4583: Failed to compile "('0', 0)[1] ! xs:integer(.)"
  • Bug #4584: document-uri() applied to initial source document gives no result
  • Bug #4587: use of undefined system property like system-property('product') gives Internal error: bad input to string constructor
  • Bug #4588: xsl:initial-template seems to be executed by fn:transform called from SaxonJS.XPath.evaluate although options set initial-match-selection and global-context-item
  • Bug #4589: Command line with no -o option: files written to parent of working directory
  • Bug #4590: xsl:result-document writing to file containing spaces
  • Bug #4596: XML output has empty line between XML declaration and root element
  • Feature #4598: Recognize exslt:node-set() extension function
  • Bug #4601: Problem with namespaces containing "="
  • Bug #4603: format-number() - grouping separator before any digit character
  • Bug #4607: Transformation failure from XX-compiled SEF for Saxon-Forms
  • Bug #4608: Reading JSON resource over HTTP: TypeError: c.codePointAt is not a function
  • Bug #4611: XPath expression "function(){'x'}()" crashes with TypeError: this.closureContext.localVars.slice is not a function
  • Bug #4612: XPath expression "function($x){true()}(17)" crashes "$elaborate$$ is not a function"
  • Bug #4613: Map is not substitutable for Function
  • Bug #4616: default-collation
  • Bug #4619: XX Compiler failure with static parameters whose type has an occurrence indicator
  • Bug #4622: Adaptive serializer fails when outputting a single attribute node
  • Bug #4624: Matching with namespaces in SaxonJS / NodeJS
  • Bug #4625: Representation of xs:base64Binary and xs:hexBinary
  • Bug #4629: Failure in key() function (originally from David Carlisle's HTML parser)
  • Bug #4634: In regular expressions, \W matches 'a'
  • Bug #4660: Incorrect xpath-default-namespace on included files with XX compiler
  • Bug #4681: namespace declaration not honored: error XTDE1390 undeclared prefix: saxon
  • Bug #4686: XSLT 3 using fold-left fails in Saxon-JS 2 with error Expected mode, found function
  • Bug #4690: generate-id problem when chaining stylesheets and storing intermediary results as a tree
  • Bug #4702: CR (x13) under node.js
  • Bug #4723: XSLT 3 using function-lookup gives TypeError: h is not a function
  • Bug #4725: Saxon-JS 2 fails to compile XSLT stylesheet giving error "Required cardinality of value of parameter $static-base-uri is exactly one; supplied value is empty"
  • Bug #4728: Coverage for event handling
  • Bug #4734: SaxonJS.transform nonInteractive option does not work
  • Bug #4742: innermost() - nodes missing from result
  • Bug #4743: Performance: substring() and subsequence()
  • Feature #4748: Option to supply Accept header in SaxonJS.getResource()
  • Bug #4754: xs:decimal idiv operator (suspicious code)
  • Bug #4756: Failure XTTE3090 with on-no-match=deep-skip
  • Bug #4757: Casting from xs:date to xs:dateTimeStamp
  • Bug #4758: Casting large xs:decimal values to xs:integer
  • Bug #4762: Function conversion rules in option parameters conventions
  • Bug #4767: xsl:with-param value evaluation in xsl:call-template in ixsl:schedule-action
  • Bug #4776: Arithmetic in backwards compatibility mode
  • Bug #4777: Shadow attribute xsl:include/@href
  • Bug #4778: snapshot() function applied to a namespace node fails with internal error
  • Bug #4779: Bad command line parameters cause internal error and stack trace
  • Bug #4780: UntypedAtomic to xs:double conversion does not happen for a dynamic call to fn:abs#1
  • Bug #4781: Higher-order functions: No failure reported when supplied function doesn't match required signature
  • Bug #4783: Incorrect results when comment node is created as child of document node
  • Bug #4785: fn:path() for parentless element node gives /Q{}foo[1]
  • Bug #4787: Map failures with temporal keys using timezones under advanced closure compilation
  • Bug #4802: Overzealous optimization
  • Bug #4804: Failure in XX compiler, incorrect type inferencing
  • Bug #4805: Command line: -s option with HTTP or FILE uri
  • Feature #4806: Transforming JSON input
  • Bug #4818: fn:sort with three arguments gives error TypeError: d.compareTo is not a function
  • Bug #4830: HTML response from ixsl:schedule-action is parsed as XML, causing failure
  • Bug #4843: js:history.pushState() has no effect?
  • Feature #4844: Could 'resize' be added to the list of windowEvents?
  • Bug #4852: SaxonJS incorrectly URI encodes 'value' attributes on 'input' elements
  • Bug #4863: If the root element is an empty element, it is not serialized correctly
  • Bug #4877: AssertionError: TypeError [ERR_INVALID_ARG_TYPE]: The "data" argument must be of type string or an instance of Buffer, TypedArray, or DataView. Received an instance of Array

Major release 2.0

12 June 2020

Saxon-JS 2 is a major upgrade from the previous Saxon-JS 1 releases. The most obvious changes are:

  • The product is now available on Node.js as well as in the browser.
  • The product now includes an XSLT compiler as well as a run-time, so it is no longer restricted to users who have purchased a Saxon-EE license.

But there's also a vast number of smaller changes:

  • A serializer with a very high level of conformance to the W3C specifications.
  • A richer JavaScript API both for XSLT transformations and XPath evaluation.
  • Support for higher-order functions.
  • General filling in of remaining conformance gaps, taking us to 99.9% coverage of XSLT 3.0 and XPath 3.1.
  • Significant performance enhancements.

We're very excited by the potential of this product. Node.js has become a very popular platform for high-performance web services, and until now it has had rather poor support for XML technologies generally, and XSLT in particular. Saxon-JS on Node.js is effectively a brand new XSLT processor, which can now operate completely independently of the Java product. Our initial performance results are very encouraging indeed.

For use with Saxon-JS 2, SEFs must be produced with Saxon-EE 10.0 or later, or compiled using the internal compiler in Saxon-JS 2 on Node.js.

Changes

See the Change history section of the documentation for full details.

Bug fixes

  • Bug #3132: Composite keys in xsl:key not implemented
  • Feature #3238: Non-interactive stylesheets
  • Bug #3387: Inverse character ranges in regular expressions
  • Bug #3413: Test accumulator-014 fails "Invalid local name"
  • Feature #3420: xsl:global-context-item is not implemented
  • Bug #3422: Failure to report XTDE3052
  • Bug #3423: Incorrect binding to modes by name
  • Bug #3424: Two keys with same name in different packages
  • Bug #3425: Cannot handle more than two packages
  • Bug #3435: Function call to xsl:original() is not supported
  • Bug #3436: Two accumulators with same name in different packages
  • Bug #3461: Asynchronous fetch for other external resources
  • Feature #3462: Asynchronous fetch for internal resources
  • Bug #3535: initial-function parameters are not type-checked
  • Bug #3561: generate-id() on attribute and namespace nodes may produce a non-ASCII string
  • Feature #3569: Test if a Javascript property exists before calling ixsl:get()
  • Feature #3570: Add a function or instruction like ixsl:remove-property
  • Feature #3572: Have an extra attribute for ixsl:set-attribute to select the element to be affected
  • Feature #3589: Saxon-JS should depend only upon JavaScript, not web browsers
  • Bug #3899: Incorrect handling of mixed backward-compatibility xsl:key
  • Bug #4103: Saxon-JS dynamic loading errors - it won't run on Tizen OS in a webapp browser (on Smartwatches and TVs)
  • Bug #4116: Cannot load SEF stylesheet under NW.js
  • Bug #4174: No response body from HTTP request when http.status >= 400
  • Bug #4176: parse-xml() in Saxon-JS loses html namespace
  • Bug #4191: Saxon-JS error on null Content-Type
  • Bug #4424: Arithmetic with large integers

Maintenance release 1.2.0

5 October 2018

Bug fixing maintenance release. Primarily fixes to allow Saxon-JS to work correctly with SEFs produced with Saxon 9.9.

In general for use with Saxon-JS 1.x, SEFs should be produced with Saxon-EE 9.7.0.15 or later, though to be able to use all new features since Saxon-JS 1.1 it is recommended that SEFs are produced with Saxon-EE 9.8.0.12 or later.

Changes

  • SEFs produced using Saxon-EE 9.9 require Saxon-JS 1.2.

Bug fixes

  • Bug #3783: Incorrect evaluation of ?* on arrays
  • Bug #3790: Saxon-JS documentation app search problems
  • Bug #3813: Should add err=http://www.w3.org/2005/xqt-errors to the list of conventional namespace bindings
  • Bug #3833: Problems using fn:replace() with special characters in replacement string
  • Bug #3865: Issues running 9.9 SEFs with Saxon-JS 1.1.0
  • Bug #3869: Missing run time type check for value comparisons for xs:qname and xs:duration
  • Bug #3870: Mishandled "undefined" in code for filter expression
  • Bug #3910: Error using fn:replace() with "q" flag when search string contains "-" character
  • Bug #3944: fn:innermost() expects input sequence to be in document order

Maintenance release 1.1.0

9 May 2018

Bug fixing maintenance release.

In general for use with Saxon-JS 1.x, SEFs should be produced with Saxon-EE 9.7.0.15 or later, though to be able to use all new features of Saxon-JS 1.1 it is recommended that SEFs are produced with Saxon-EE 9.8.0.12 or later (beware the ixsl:schedule-action/@wait bug #3734 in 9.8.0.10 and 9.8.0.11).

Changes

See the Change history section of the documentation for full details. Below is a summary:

  • Changes have been made to the way that JavaScript objects are converted to XDM, and the way that XDM maps are converted to JavaScript. See JS/XDM type conversion and Supplying stylesheet parameters for up to date details.

  • Serialization to JSON is implemented (with some restrictions).

  • Added two ways to set the logging level for warnings, processing messages, or full tracing, using the Saxon-JS API: the API method SaxonJS.setLogLevel, and the SaxonJS.transform option logLevel.

  • Additions to the SaxonJS.transform API: templateParams and tunnelParams to allow parameters to be supplied for call-template invocation.

  • The extension instruction ixsl:schedule-action has been updated to allow document fetches and HTTP requests to be terminated: either using a timeout, or by user initiated abort. Requires Saxon-EE 9.8.0.10 or later at compile time. See HTTP request termination for more information and examples.

  • Some Saxon extension functions are now available in Saxon-JS (see Saxon extensions): saxon:discard-document() and saxon:timestamp().

Bug fixes

  • Bug #3223: Supplying Document objects to JavaScript global functions
  • Bug #3378: result-document doesn't handle AVT for method
  • Bug #3379: regex-group() value is not maintained through calls of xsl:apply-templates and xsl:apply-imports
  • Bug #3381: Spurious "unmatched ')'" error in regular expression
  • Bug #3475: Problem with SEF generated using Oxygen 19.1 "Compile XSLT Saxon 9.8" add-on
  • Bug #3499: Keys should be invalidated if the (relevant part of the) HTML page is updated
  • Bug #3500: ixsl:event() does not correctly return an empty sequence when there is no current event
  • Bug #3501: Error when object supplied to ixsl:get() is null
  • Bug #3502: ixsl:source() does not correctly return an empty sequence when there is no global context item
  • Bug #3544: Third argument of ixsl:call() is an array, documentation is inconsistent
  • Bug #3545: Inconsistencies using map functions on JS objects
  • Bug #3564: Check that context item is an element for ixsl:set-attribute and ixsl:remove-attribute
  • Feature #3568: Add a way to cancel a scheduled action
  • Feature #3571: Have some equivalent of saxon:discard-document
  • Bug #3596: current-date and current-dateTime does not give the instant date/time stamp
  • Bug #3611: Handle error responses from HTTP requests
  • Bug #3670: Implement more transform options
  • Bug #3676: Implement serialization to JSON
  • Bug #3689: Problem with apply-templates in "#current" mode
  • Bug #3704: Issues with ixsl:style()
  • Bug #3718: Mishandling null, undefined, and array results from ixsl functions
  • Bug #3727: Edge browser problem for script elements dynamically added to page
  • Bug #3738: Cannot set properties to null using ixsl:set-property
  • Feature #3741: Allow users to configure message logs
  • Bug #3756: Stack overflow in base64_decode()

Maintenance release 1.0.2

5 October 2017

Bug fixing maintenance release.

In general for use with Saxon-JS 1.0 SEFs should be produced with Saxon-EE 9.7.0.15 or later, though a number of features introduced in Saxon-JS 1.0.1 require SEFs produced with Saxon-EE 9.8 (see the documentation for details).

Changes

  • A space-separated list can now be supplied in the document attribute of ixsl:schedule-action, to fetch multiple documents before the contained call is invoked.

Bug fixes

  • Feature #2889: Missing error trapping in Calculate
  • Bug #3268: Saxon-JS documentation app problems in Safari on iPad (and other handheld devices)
  • Bug #3362: reverse() modifies its argument
  • Bug #3369: Incorrect test for node identity in p.genNode pattern matching
  • Bug #3370: currentGroup / currentGroupingKey
  • Bug #3377: HTML base tag ignored in stylesheetLocation and sourceLocation
  • Bug #3380: xsl:analyze-string with a regex that matches a zero-length string
  • Bug #3383: General Comparison in 1.0 compatibliity mode: cannot compare xs:string with xs:integer
  • Bug #3386: deep-equal() fails comparing attributes
  • Bug #3393: "<" treated as entity characters within XPath.evaluate()
  • Bug #3417: unparsed-text-lines() incorrect behaviour with blank lines
  • Bug #3419: format-number() rounding issues
  • Bug #3431: non-default exponentSeparator character not interpolated
  • Bug #3440: Handling asynchronous document fetch failures
  • Feature #3441: Asynchronous fetch for a list of documents
  • Bug #3442: Problems reusing parameters after ixsl:schedule-action
  • Bug #3454: Documentation for ixsl:schedule-action/@http-request
  • Bug #3470: SaxonJS 1.0.1 fails when calling the key() function; SaxonJS 1.0.0 works well

Also includes a patch for a known Edge bug related to regular expressions used in reading XML resources (see Forum issue #6873).

Maintenance release 1.0.1

21 July 2017

Maintenance release for use on web browsers. A number of new features require SEFs produced with Saxon-EE 9.8 (in general SEFs should be produced with Saxon-EE 9.7.0.15 or later for use with Saxon-JS 1.0).

Changes

  • Many more XSLT 3.0 features are now implemented. Some require Saxon 9.8 at compile time. See conformance for full details. Newly implemented features include:
    • xsl:where-populated, xsl:on-empty, xsl:on-non-empty, xsl:fork
    • snapshot(), available-system-properties()
    • use of initial mode "#unnamed"
    • accumulators (requires Saxon 9.8)
    • collection() (requires Saxon 9.8)
    • merging (requires Saxon 9.8)
    • multiple packages (requires Saxon 9.8)
    • xsl:source-document in non-streaming mode (requires Saxon 9.8)
    • xsl:context-item (requires Saxon 9.8)
    • Support for collations has been extended to XSLT instructions as well as XPath functions
    • Regex character class subtraction
    • Fixes for xsl:evaluate (default XPath namespace; support for @as result type restriction; support for xsl:with-param in addition to @with-params)
  • Additions to the SaxonJS.transform API: initial-function and function-params to allow function call invocation; collations to supply collations; collectionFinder to supply collections.
  • The SaxonJS.transform() option initial-mode set to "#unnamed" can be used to force use of the unnamed mode. If initial-mode is not set, then the default-mode specified in xsl:stylesheet (or xsl:package) is used, defaulting to the unnamed mode.
  • Added interactive XSLT mechanism for making asynchronous HTTP requests directly from the stylesheet - using the new http-request attribute on ixsl:schedule-action (requires Saxon 9.8). See HTTP messages for more information.
  • Using Saxon 1.0.0 or earlier, URIs in the doc() function and in the document attribute of ixsl:schedule-action were always interpreted relative to the SEF's location. In Saxon-JS 1.0.1, the behaviour depends on whether the SEF is relocatable, since this will determine the static-base-uri(). From Saxon 9.8, a relocatable SEF can be produced by setting the Transform command line option -relocate:on at compile time. If the SEF is relocatable, then static-base-uri() is the base URI of the SEF; otherwise it is the location of the XSLT stylesheet at compile time. For full details see the section about relative URIs at Source documents.

Bug fixes

  • Feature #3004: Support for HTTP POST/PUT
  • Bug #3036: Saxon-JS documentation app problems in Chrome on computers with touch screens
  • Bug #3066: Specialist name() treatment of XHTML elements
  • Bug #3130: Source document has a non-absolute base-uri()
  • Bug #3131: XPath.evaluate - incorrect comparison typing for xs:QName
  • Bug #3133: xs:numeric cast not preserving value type
  • Bug #3134: map:get() key not being atomised
  • Bug #3139: Complex Content incorrectly handing text-nodes
  • Bug #3140: XPath.evaluate should check initial context-item cardinality
  • Bug #3146: system-property("xsl:supports-dynamic-evaluation") returns "no"
  • Bug #3148: xsl:evaluate doesn't support use of user-defined functions
  • Bug #3149: Constructed element node lacks xmlns="" undeclaration
  • Bug #3161: || operator in dynamic XPath does no type checking
  • Bug #3167: Problems with QName hash-codes in trieWithCollation()
  • Bug #3170: Attributes with no prefix in name get assigned 'ns'
  • Bug #3187: Printing
  • Bug #3203: Default namespace XHTML not appearing in namespace-uri-from-prefix()
  • Bug #3216: Error QNames are not ordered
  • Bug #3221: p.genPos pattern not implemented in Saxon-JS
  • Bug #3231: Default treatment of Atomic items in text-only-copy incorrect
  • Bug #3335: Lazy evaluation of sequence constructors - instructions with side effects evaluated early

Major release 1.0.0

7 February 2017

First major release, for use on web browsers. For use with Saxon-JS 1.0, SEFs should be produced with Saxon-EE 9.7.0.15 or later.

Changes

  • For use with Saxon-JS 1.0, SEFs should be produced with Saxon-EE 9.7.0.15 or later. (Most SEFs produced by older versions of Saxon-EE will run as before, but some will fail with an error directing the user to regenerate the SEF.)
  • Added Dynamic XPath evaluation for use with xsl:evaluate, and directly via the XPath API.
  • The use of collations in XPath functions is now implemented, see Conformance for details (and restrictions).
  • Known performance issues have been addressed.

Bug fixes

  • Bug #3071: Bad performance of xsl:result-document with deeply nested output content
  • Bug #3095: XPath.evaluate requires platform initialisation
  • Bug #3098: Supplied value "..." is not a valid xs:base64

Maintenance beta release 0.9.1.1

12 December 2016

Maintenance release for use on web browsers.

Bug fixes:

  • Bug #3067: Specialist name() treatment of XHTML elements

Maintenance beta release 0.9.1

9 December 2016

Maintenance beta release for use on web browsers (Safari, Firefox, Chrome, Opera, Internet Explorer, and Edge). This release can be used with SEFs produced by Saxon-EE 9.7.0.7 or later, but for all the latest features use Saxon-EE 9.7.0.14 or later.

Changes

  • The form <xsl:result-document href="?."> can now be used to specify the current context as the target for inserting generated HTML fragments, see Result documents.
  • Added support for the transform options sourceNode and sourceText, see SaxonJS.transform.
  • Values for stylesheet parameters with type map(*) and array(*) can now be supplied using the transform option stylesheetParams (requires Saxon-EE 9.7.0.14 or later). See Supplying stylesheet parameters.
  • The interactive XSLT function ixsl:apply() is added (requires Saxon-EE 9.7.0.12 or later).
  • The XSLT 3.0 xsl:iterate and xsl:evaluate instructions are now implemented (requires Saxon-EE 9.7.0.12 or later).
  • The third-party URI.js library is no longer used.
  • Extended browser support: Saxon-JS 0.9 tested with current versions of Safari, Firefox and Chrome; Saxon-JS 0.9.1 also tested with Internet Explorer, Edge and Opera.

Bug fixes

  • Bug #2752: JS: nashorn references in core (browser) code
  • Bug #2796: JS: xs:date() can modify timezone for pure dates
  • Bug #2833: JS: anomalous descendant behaviour under ixsl:page()
  • Bug #2884: Registering event listeners for objects outside DOM
  • Bug #2885: Use of URI.js
  • Feature #2886: Converting JS Objects to XDM maps
  • Bug #2888: Static base-uri for in-browser exported stylesheets.
  • Bug #2890: document.createAttributeNS() deprecated - warning in Firefox
  • Bug #2891: Checksum in SEF file
  • Bug #2913: http://www.saxonica.com/saxon-js/documentation/ does not work with Edge
  • Bug #2923: Incorrect comparison for xs:numeric and NaN
  • Bug #2941: Crash when there is no context item
  • Bug #2942: Failure to specify -target:JS
  • Bug #2944: Use of xsl:sequence within copy situations is node-destructive
  • Bug #2945: for-each-group context not being preserved over context-altering steps
  • Bug #2947: Cities List example
  • Bug #2948: SEF metadata
  • Feature #2966: xsl:iterate
  • Bug #2992: treat as not testing sequence cardinality
  • Bug #3007: sourceNode or sourceText property of options argument of transform method not used
  • Bug #3008: ixsl:query-params() does not allow for multiple values associated with a single field
  • Bug #3012: In browser, do not always produce HTML elements in result documents when they should be produced
  • Bug #3020: _APPLY() construct has not been implemented in Saxon-JS

First beta release 0.9

28 July 2016

First beta release for use on web browsers with SEFs produced by Saxon-EE 9.7.0.7 or later.