The XSLT Playground without the 1.0 ceiling.
A single Python file that embeds Saxon, so XSLT 1.0, 2.0 and 3.0 all run — the same range Workday accepts in both EIB and Studio. It opens a local UI in your browser, or runs one-shot in a pipeline.
Your files stay on your machine. The only server involved is the one the script starts on
127.0.0.1 for its own interface.
Install uv once, then:
uv run xslt3.py
That opens the interface in your browser. The script declares its own dependencies inline
(PEP 723), so uv builds a throwaway environment automatically — no virtualenv, no
requirements.txt, nothing to rot.
Without uv: pip install saxonche && python xslt3.py
uv run xslt3.py -x source.xml -s transform.xsl # to stdout
uv run xslt3.py -x source.xml -s transform.xsl -o out.csv # to a file
uv run xslt3.py -x source.xml -s transform.xsl -p year=2026 # with parameters
uv run xslt3.py -s build.xsl --initial-template main # no source document
Output goes to stdout, errors to stderr with a non-zero exit code, so it pipes cleanly:
uv run xslt3.py -x in.xml -s t.xsl | wc -l
Verified against SaxonC-HE 13: xsl:for-each-group with
current-grouping-key(), tokenize(), replace(),
upper-case(), maps and arrays with ? lookup, xsl:mode,
text value templates, xs: constructors, format-number(),
JSON serialisation, and stylesheet parameters. XPath 3.1 has its own tab.
Because it runs locally it can also read and write files by path, so a large extract never has to go through a textarea.
Saxon's, with line, column and error code — rather than the browser's "the transform produced no result":
Error in {bogus(1)} in xsl:value-of/@select on line 1 column 137
XPST0017 Cannot find a 1-argument function named Q{...}bogus()
127.0.0.1 only — never reachable from another machine.Host header is not loopback are rejected, which blocks
DNS-rebinding from a website you happen to have open.saxonche is about 290 MB installed. It ships a native Saxon build.
uv caches it once, so it is a one-time download — but it is not small, and it is why there
is no single-file executable version.
xsl:stream),
schema-awareness and a few optimiser features are PE/EE only. Everything a typical EIB or
Studio stylesheet uses is in HE.| Browser | This | |
|---|---|---|
| XSLT version | 1.0 | 1.0, 2.0, 3.0 |
| Covers what Workday accepts | part of it | all of it |
| Install needed | none | uv + a 290 MB cache |
| File size | what fits in a textarea | anything on disk |
| Scriptable / CI | no | yes |
EIB and Studio both accept XSLT 1.0 through 3.0, so the browser playground only covers part of what you can actually deploy. Use it for a quick 1.0 check or on a machine you cannot install on; use this for anything above 1.0, for large files, or in a pipeline.