1
0
mirror of https://github.com/alexandrev/xslt-lab.git synced 2026-09-13 08:43:16 +00:00
Files
claude-code 40b81728d6 Competitive batch: Saxon 12.9, 2.0 tracing, saved fiddles, multi-engine story
From the August competitive analysis, the items that close real gaps:

- Saxon HE 12.5 -> 12.9 (the closest competitor already ships 12.9). The
  trace/hotspot instrumentation is reflection-based, so it was verified
  against the new jar: variables and execution counts come back intact.

- Tracing now works for XSLT 2.0. The trace infrastructure needs Saxon 10+
  APIs and cannot load inside the Saxon 9 daemon, so traced 2.0 requests run
  on Saxon 12 in backwards-compatible mode instead of silently returning an
  empty trace — a real trace with a small, labeled semantic difference.
  Untraced 2.0 runs still use Saxon 9. XSLT 1.0 now says outright that XSLTC
  has no tracing hook rather than pretending.

- Saved fiddles: POST /fiddle stores the workspace under a 7-char id with an
  append-only revision history; ?f=ID loads it (optionally &r=N). Available
  whenever DATABASE_URL is configured — unlike /history this is
  unauthenticated, because a fiddle is a thing you share with someone who has
  no account. An unreachable database degrades to "fiddles off" instead of
  crashlooping: the chart has shipped a placeholder databaseUrl for a long
  time, and opening it eagerly would have taken production down.

- The home page now tells the truth about engines: 1.0 on XSLTC, 2.0 on
  Saxon 9, 3.0 on Saxon 12.9 — three real processors was already the
  architecture, it just was never marketed.

- Four posts aimed at where the demand data points: the FreeFormatter
  shutdown audience, Chrome's XSLT removal (v158, Nov 2026), Peppol/EN-16931
  Schematron validation and ISO 20022 camt transformations. Every example was
  executed against the real backend and the published output matches.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KZntQUfw463NW4ftgSjWw5
2026-08-14 11:39:00 +00:00

421 lines
20 KiB
HTML

<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="google-adsense-account" content="ca-pub-1549720748100858" />
<link rel="preload" href="/logo.svg" as="image" type="image/svg+xml" />
<script>
window.addEventListener("error", function (e) {
if (e.message && e.message.includes("ResizeObserver loop")) {
e.stopImmediatePropagation();
}
}, true);
</script>
<title>XSLT Tester &amp; Validator Online — Free, XSLT 1.0 / 2.0 / 3.0</title>
<meta
name="description"
content="Run, test and validate XSLT 1.0, 2.0 and 3.0 online. Paste your XML and stylesheet — results in seconds, powered by Saxon. Free, no signup."
/>
<meta
name="keywords"
content="xslt online, xslt editor, xslt tester, xslt validator, xslt viewer, xsl editor, xsl tester, xsl viewer, xslt playground, xslt 3.0, xslt 2.0, online xslt editor, xslt transformation online, validate xslt online, xml transformation, saxon xslt"
/>
<meta property="og:title" content="XSLT Tester &amp; Validator Online — Free, XSLT 1.0 / 2.0 / 3.0" />
<meta
property="og:description"
content="Free online XSLT tool supporting XSLT 1.0, 2.0 and 3.0 via Saxon. Transform and validate XML instantly in your browser. No install, no signup."
/>
<meta property="og:type" content="website" />
<meta property="og:url" content="https://xsltplayground.com/" />
<meta property="og:image" content="https://xsltplayground.com/og-image.png" />
<meta property="og:image:width" content="1200" />
<meta property="og:image:height" content="630" />
<meta property="og:image:alt" content="XSLT Playground — Transform XML online with XSLT 1.0, 2.0 &amp; 3.0" />
<meta property="og:site_name" content="XSLT Playground" />
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:title" content="XSLT Online — Free Editor, Tester &amp; Validator" />
<meta name="twitter:description" content="Free online XSLT tool supporting XSLT 1.0, 2.0 and 3.0 via Saxon. No install, no signup." />
<meta name="twitter:image" content="https://xsltplayground.com/og-image.png" />
<link rel="canonical" href="https://xsltplayground.com/" />
<link rel="icon" type="image/x-icon" href="/favicon.ico" />
<link rel="preconnect" href="https://www.clarity.ms" />
<link rel="preconnect" href="https://media.ethicalads.io" />
<script type="application/ld+json">
[
{
"@context": "https://schema.org",
"@type": ["WebApplication", "SoftwareApplication"],
"name": "XSLT Playground",
"alternateName": ["XSLT Online", "Online XSLT Editor"],
"url": "https://xsltplayground.com/",
"description": "Free online XSLT editor, tester and validator. Run XSLT 1.0, 2.0 and 3.0 transformations instantly using Saxon processor. No installation required.",
"applicationCategory": "DeveloperApplication",
"operatingSystem": "Any",
"offers": {
"@type": "Offer",
"price": "0",
"priceCurrency": "USD"
},
"featureList": [
"XSLT 1.0, 2.0 and 3.0 support",
"Three real engines: XSLTC (1.0), Saxon 9 (2.0), Saxon HE 12.9 (3.0)",
"Real-time XML transformation",
"XSLT validator with detailed error messages",
"Multiple XML inputs and parameters",
"Execution trace and debugging",
"Multiple workspaces",
"Import/Export workspaces as JSON"
]
},
{
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [
{
"@type": "ListItem",
"position": 1,
"name": "XSLT Online Editor",
"item": "https://xsltplayground.com/"
}
]
},
{
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [
{
"@type": "Question",
"name": "Does this XSLT tester support XSLT 3.0?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Yes. XSLT Playground is one of the very few free online tools that fully supports XSLT 3.0 via Saxon HE 12.9. You can use maps, arrays, xsl:merge, xsl:on-empty, higher-order functions, and all other XSLT 3.0 features."
}
},
{
"@type": "Question",
"name": "What XSLT processor does XSLT Playground use?",
"acceptedAnswer": {
"@type": "Answer",
"text": "The backend uses Saxon HE 12.9, the open-source edition of Saxonica's Saxon processor — the industry standard for XSLT 2.0 and 3.0 processing, used in enterprise applications worldwide."
}
},
{
"@type": "Question",
"name": "Can I transform XML to HTML online with XSLT?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Yes. Write an XSLT stylesheet with method='html' and XSLT Playground will show a live rendered preview of the HTML output alongside the source code."
}
},
{
"@type": "Question",
"name": "What is the difference between XSLT 1.0, 2.0 and 3.0?",
"acceptedAnswer": {
"@type": "Answer",
"text": "XSLT 1.0 is the original standard (1999), supported by all browsers. XSLT 2.0 (2007) adds grouping, regular expressions, multiple output documents and XPath 2.0. XSLT 3.0 (2017) adds streaming, maps, arrays, higher-order functions and JSON support. XSLT Playground supports all three versions via Saxon."
}
},
{
"@type": "Question",
"name": "Can I view and validate XSLT output online?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Yes. XSLT Playground works as an online XSLT viewer and validator: it shows the formatted transformation output with syntax highlighting and a live HTML preview, and validates your stylesheet by reporting the exact line number and Saxon error message for any problem."
}
},
{
"@type": "Question",
"name": "Is XSLT Playground free to use?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Yes, XSLT Playground is completely free. No account, no signup, and no installation required. Your workspaces are saved locally in your browser."
}
}
]
}
]
</script>
<style>
body {
margin: 0;
font-family: Arial, sans-serif;
background: #f5f5f5;
color: #21426c;
}
.app-shell {
min-height: 100vh;
display: flex;
flex-direction: column;
gap: 1rem;
padding: 1.25rem;
}
.shell-top {
display: flex;
align-items: center;
gap: 0.75rem;
}
.shell-logo {
width: 32px;
height: 32px;
}
.shell-title {
font-weight: 700;
font-size: 1.1rem;
margin: 0;
}
.shell-subtitle {
font-size: 0.9rem;
color: #536084;
}
.shell-grid {
display: grid;
gap: 0.75rem;
grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
}
.shell-pane,
.shell-bar {
border-radius: 12px;
background: linear-gradient(90deg, #eef3ff, #f8fbff, #eef3ff);
background-size: 200% 100%;
animation: shell-shimmer 1.6s ease-in-out infinite;
min-height: 160px;
}
.shell-bar {
min-height: 48px;
}
/* Skeleton panes carrying the real sample code. A CSS gradient is not an
LCP candidate but text is, so filling these makes the largest element on
the page paint at FCP instead of after React mounts. border-box keeps
them at exactly the same 160px as the empty shimmer panes, so adding the
content costs no extra layout shift. */
.shell-pane--code {
box-sizing: border-box;
animation: none;
background: #fbfdff;
border: 1px solid #e3ebf7;
padding: 0.55rem 0.7rem;
overflow: hidden;
}
.shell-code {
margin: 0;
font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
font-size: 13px;
line-height: 1.45;
color: #4a5b7d;
white-space: pre;
overflow: hidden;
}
@keyframes shell-shimmer {
0% { background-position: 200% 0; }
100% { background-position: -200% 0; }
}
/* SEO content section */
#seo-content {
max-width: 860px;
margin: 0 auto;
padding: 3rem 1.5rem 4rem;
font-size: 1rem;
line-height: 1.7;
color: #21426c;
}
#seo-content h1 { font-size: 1.9rem; margin: 0 0 1rem; }
#seo-content h2 { font-size: 1.3rem; margin: 2rem 0 0.5rem; }
#seo-content p, #seo-content li, #seo-content dd { color: #374151; }
#seo-content ul, #seo-content ol { padding-left: 1.5rem; }
#seo-content li { margin-bottom: 0.4rem; }
#seo-content dl { margin: 0; }
#seo-content dt { font-weight: 700; margin-top: 1.2rem; color: #21426c; }
#seo-content dd { margin: 0.2rem 0 0 0; }
#seo-content a.seo-cta {
display: inline-block;
background: #21426c;
color: #fff;
padding: 0.65rem 1.4rem;
border-radius: 6px;
text-decoration: none;
font-weight: 600;
margin-top: 1rem;
}
#seo-content .version-links { display: flex; gap: 1rem; margin-top: 1rem; flex-wrap: wrap; }
#seo-content .version-links a {
padding: 0.5rem 1rem;
border: 2px solid #21426c;
border-radius: 6px;
text-decoration: none;
color: #21426c;
font-weight: 600;
}
</style>
<script type="module" src="/env.js"></script>
<script>
window.addEventListener("load", function () {
var clarityId = window.env && window.env.VITE_CLARITY_ID;
if (!clarityId) return;
(function (c, l, a, r, i, t, y) {
c[a] = c[a] || function () { (c[a].q = c[a].q || []).push(arguments); };
t = l.createElement(r); t.async = 1; t.src = "https://www.clarity.ms/tag/" + i;
y = l.getElementsByTagName(r)[0]; y.parentNode.insertBefore(t, y);
})(window, document, "clarity", "script", clarityId);
}, { once: true });
</script>
<script>
const loadAdsense = () => {
const client = window.env && window.env.VITE_ADSENSE_CLIENT;
if (!client) return;
const s = document.createElement("script");
s.async = true;
s.src =
"https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=" +
client;
s.crossOrigin = "anonymous";
document.head.appendChild(s);
};
const scheduleAdsense = () => {
if ("requestIdleCallback" in window) {
window.requestIdleCallback(loadAdsense, { timeout: 2500 });
} else {
window.setTimeout(loadAdsense, 1500);
}
};
if (document.readyState === "complete") {
scheduleAdsense();
} else {
window.addEventListener("load", scheduleAdsense, { once: true });
}
</script>
<!-- Umami: self-hosted, cookieless. The landing pages had no analytics at
all, so their traffic was invisible outside Search Console. -->
<script defer src="https://umami.alexandre-vazquez.cloud/script.js" data-website-id="043e327b-723e-4efd-9ac9-46589219c706"></script>
</head>
<body>
<div id="root">
<div class="app-shell" role="status" aria-live="polite">
<div class="shell-top">
<img src="/logo.svg" alt="XSLT Playground logo" class="shell-logo" fetchpriority="high" />
<div>
<p class="shell-title">Online XSLT Editor &amp; Tester</p>
<div class="shell-subtitle">Loading the editor...</div>
</div>
</div>
<div class="shell-grid">
<div class="shell-pane shell-pane--code">
<pre class="shell-code" aria-hidden="true">&lt;xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"&gt;
&lt;xsl:output method="xml" indent="yes"/&gt;
&lt;xsl:template match="/"&gt;
&lt;catalog total="{count(//book)}"&gt;
&lt;xsl:apply-templates select="//book[@lang='en']"/&gt;
&lt;/catalog&gt;
&lt;/xsl:template&gt;</pre>
</div>
<div class="shell-pane shell-pane--code">
<pre class="shell-code" aria-hidden="true">&lt;books&gt;
&lt;book lang="en"&gt;
&lt;title&gt;XSLT 2.0 and XPath 2.0&lt;/title&gt;
&lt;author&gt;Michael Kay&lt;/author&gt;
&lt;year&gt;2008&lt;/year&gt;
&lt;/book&gt;
&lt;book lang="es"&gt;
&lt;title&gt;Aprende XML con XSLT&lt;/title&gt;
&lt;/book&gt;</pre>
</div>
</div>
<div class="shell-bar"></div>
</div>
</div>
<!-- Static SEO content — always in DOM, indexed by crawlers, visible below the app -->
<section id="seo-content" aria-label="About XSLT Playground">
<h1>XSLT Online — Free XSLT Editor, Tester, Viewer &amp; Validator</h1>
<p>
<strong>XSLT Playground</strong> is the most powerful free online XSLT tool available — an
editor, tester, viewer and validator in one. Unlike every other online XSLT tester, it supports
<strong>XSLT 1.0, XSLT 2.0, and XSLT 3.0</strong> via <strong>Saxon HE 12.9</strong> — the same
enterprise-grade processor used in production applications worldwide. Run any XSLT transformation
online and see the result instantly. No installation, no account, no limits.
</p>
<a class="seo-cta" href="https://xsltplayground.com/">Open the XSLT Editor →</a>
<div class="version-links">
<a href="/xslt-2-0/">XSLT 2.0 Online Tester</a>
<a href="/xslt-3-0/">XSLT 3.0 Online Tester</a>
<a href="/xpath-tester/">XPath Tester</a>
<a href="/xml-to-json/">XML to JSON</a>
<a href="https://xsltplayground.com/blog/xslt/functions/">XSLT &amp; XPath Function Reference</a>
</div>
<h2>Transform XML with XSLT Online — XSLT 1.0, 2.0 and 3.0</h2>
<p>
Whether you need to transform XML to HTML, XML to XML, or XML to plain text,
XSLT Playground handles it all. Paste your XSLT stylesheet and XML input,
and results appear in milliseconds — powered by a real Saxon backend, not a browser polyfill.
</p>
<p>
The tool supports all three XSLT versions in a single editor. Switch between
XSLT 1.0, 2.0 and 3.0 with one click. Perfect for testing stylesheets across versions
or learning the differences between the standards.
</p>
<h2>XSLT Viewer, Validator and Transformation Tool</h2>
<p>
XSLT Playground works as an <strong>online XSLT viewer</strong>: paste a stylesheet and an XML
document to view the formatted transformation output, with syntax highlighting and a live HTML
preview when your stylesheet uses <code>method="html"</code>. It is also a full
<strong>XSLT validator</strong> — invalid stylesheets are flagged with the exact line number and
the original Saxon error message, so you can validate XSLT online before deploying it to production.
</p>
<p>
Every <strong>XSLT transformation online</strong> runs against a real Saxon backend in
milliseconds. There is nothing to install and nothing to configure: open the editor, paste your
code, and the result appears automatically as you type.
</p>
<h2>How to Use the Online XSLT Tester</h2>
<ol>
<li>Open the editor at <a href="https://xsltplayground.com/">xsltplayground.com</a></li>
<li>Paste or type your XSLT stylesheet in the left panel</li>
<li>Add your XML input in the Data Pipeline panel</li>
<li>Select your XSLT version (1.0, 2.0, or 3.0) from the dropdown</li>
<li>The transformation runs automatically — results appear under 100ms</li>
<li>Share your transformation with a single shareable link</li>
</ol>
<h2>Why XSLT Playground is Better Than Other Online XSLT Tools</h2>
<ul>
<li><strong>XSLT 3.0 support</strong> — maps, arrays, streaming, higher-order functions, JSON output. No other free online tool offers this.</li>
<li><strong>XSLT 2.0 support</strong> — grouping (<code>xsl:for-each-group</code>), regular expressions, multiple output documents, XPath 2.0.</li>
<li><strong>Real processors, one per version</strong> — each XSLT version runs on the engine that actually defines it: XSLT 1.0 on the JDK's XSLTC (Xalan lineage), XSLT 2.0 on Saxon 9 (the last true 2.0 processor), and XSLT 3.0 on Saxon HE 12.9. Not a simplified browser implementation — results match production exactly, per version.</li>
<li><strong>Built-in XSLT validator &amp; viewer</strong> — validate stylesheets with exact line-number errors and view formatted output with a live HTML render preview.</li>
<li><strong>Multiple XML inputs</strong> — pass multiple documents as named parameters, just like in production pipelines.</li>
<li><strong>Execution trace</strong> — debug your stylesheet step by step, inspect variable values at runtime.</li>
<li><strong>Multiple workspaces</strong> — save up to 3 workspaces locally, no account needed.</li>
<li><strong>Import/Export</strong> — save and share complete workspaces as JSON files.</li>
</ul>
<h2>XSLT Online — Frequently Asked Questions</h2>
<dl>
<dt>Does this XSLT tester support XSLT 3.0?</dt>
<dd>Yes. XSLT Playground is one of the very few free online tools that fully supports XSLT 3.0 via Saxon HE 12.9. You can use maps, arrays, <code>xsl:merge</code>, <code>xsl:on-empty</code>, higher-order functions, and all XSLT 3.0 features.</dd>
<dt>What XSLT processor does it use?</dt>
<dd>The backend uses <strong>Saxon HE 12.9</strong>, the open-source edition of Saxonica's Saxon processor — the industry standard for XSLT 2.0 and 3.0 processing, trusted by enterprises globally.</dd>
<dt>Can I transform XML to HTML online?</dt>
<dd>Yes. Write an XSLT stylesheet with <code>method="html"</code> and XSLT Playground shows a live rendered HTML preview alongside the source output.</dd>
<dt>What is the difference between XSLT 1.0, 2.0 and 3.0?</dt>
<dd>XSLT 1.0 (1999) is the original standard. XSLT 2.0 (2007) adds grouping, regular expressions, multiple output documents, and XPath 2.0. XSLT 3.0 (2017) adds streaming, maps, arrays, higher-order functions and JSON support. XSLT Playground supports all three.</dd>
<dt>Can I view and validate XSLT output online?</dt>
<dd>Yes. XSLT Playground is an online XSLT viewer and validator: it shows formatted output with syntax highlighting and a live HTML preview, and reports the exact line number and Saxon error message when a stylesheet is invalid.</dd>
<dt>Is XSLT Playground free?</dt>
<dd>Yes, completely free. No account, no signup, no installation required. Workspaces are saved locally in your browser.</dd>
</dl>
</section>
<script type="module" src="/src/main.jsx"></script>
</body>
</html>