mirror of
https://github.com/alexandrev/xslt-lab.git
synced 2026-09-13 08:43:16 +00:00
40b81728d6
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
421 lines
20 KiB
HTML
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 & 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 & 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 & 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 & 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 & 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"><xsl:stylesheet version="1.0"
|
|
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
|
|
<xsl:output method="xml" indent="yes"/>
|
|
|
|
<xsl:template match="/">
|
|
<catalog total="{count(//book)}">
|
|
<xsl:apply-templates select="//book[@lang='en']"/>
|
|
</catalog>
|
|
</xsl:template></pre>
|
|
</div>
|
|
<div class="shell-pane shell-pane--code">
|
|
<pre class="shell-code" aria-hidden="true"><books>
|
|
<book lang="en">
|
|
<title>XSLT 2.0 and XPath 2.0</title>
|
|
<author>Michael Kay</author>
|
|
<year>2008</year>
|
|
</book>
|
|
<book lang="es">
|
|
<title>Aprende XML con XSLT</title>
|
|
</book></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 & 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 & 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 & 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>
|