XJSLT is an XSLT 2.0 compiler (targeting JavaScript) written in TypeScript, depending on fontoxpath for an XPath implementation.
XJSLT works by compiling stylesheets to runnable JavaScript. These compiled stylesheets can be used immediately in the command line, or they can be save for later use in the command line. They can also be used programmatically either in the browser or in another JavaScript runtime.
Tested with node 20 and in Chrome and Firefox.
Getting started
Installation:
npm install && npm run build
Command line invocation:
xjslt jats-html.xsl <(curl -s https://jats.nlm.nih.gov/publishing/tag-library/1.1/FullArticleSamples/bmj_sample.xml)
Compilation examples
XJSLT can compile XSLT stylesheets into executable JavaScript code, which can then be deployed to various platforms that support JavaScript, including the browser, NodeJS, and potentially other JavaScript runtimes. The following are some examples of how to do this for the browser, google cloud functions, and cloudflare edge functions. Note that this compiled .js may need to be recompiled if the xjslt version changes.
In the browser
xjslt compile --web jats-html.xsl examples/html/transform.js- Open
examples/html/example.html(will load the generatedtransform.jsfile)
For reuse in the command line
xjslt compile jats-html.xslxjslt transform.js <(curl -s https://jats.nlm.nih.gov/publishing/tag-library/1.1/FullArticleSamples/bmj_sample.xml)
In a google cloud function
xjslt compile --standalone jats-html.xsl examples/google-cloud/transform.jscd examples/google-cloudnpm installnpx @google-cloud/functions-framework --target=transform- Visit http://localhost:8080/?url=https://jats.nlm.nih.gov/publishing/tag-library/1.1/FullArticleSamples/bmj_sample.xml
In a cloudflare edge function
xjslt compile --standalone jats-html.xsl examples/cloudflare/src/transform.jscd examples/cloudflarenpm installnpm run start- Visit http://localhost:8787/?url=https://jats.nlm.nih.gov/publishing/tag-library/1.1/FullArticleSamples/bmj_sample.xml
Supported features
if/choose/when/otherwise- conditional evaluationtemplateapply-templates/for-each- recursive evaluationelement/attribute/value-of- dynamic elements, attributes, and text- literal text and xml element output
variable- namespaces
sortinclude/importresult-documentfor-each-group- 2596 passing tests in the XSLT test suite (https://github.com/w3c/xslt30-test) (2957 not passing)
Incompletely supported features
functionbasically working, with better typing TBDoutputnot all options supportednumberbasic support, not all options supported
TODO (not yet implemented)
-
analyze-string(depends on bwrrp/xspattern.js#9) - tunneled parameters
- … (probably other things I’m not aware of or forgot)
Contributing
- Some functionality, including import and include, is implemented in terms of preprocessors: xslt stylesheets that are applied to the xslt stylesheet itself before it is compiled. If you make changes that impact these preprocessors, you will need to run
npm run build-preprocessorsto recompile them.