v152 · stepped rollout · origin trial · removal
Deprecate and remove XSLT
Chrome is deprecating and removing client-side XSLT 1.0 support — both the XSLTProcessor JavaScript API and the <?xml-stylesheet type="text/xsl" ?> processing instruction — because the aging libxslt C library is a memory-safety attack surface that processes untrusted web content, while XSLT usage has fallen to roughly 0.02% of page loads. Removal from Stable is planned for Chrome 158 (Nov 17, 2026); sites can buy migration time with the “XSLT” deprecation origin trial (152–175) or the XSLTEnabled enterprise policy, both of which stop working in Chrome 176 (Aug 17, 2027).
XSLT is deprecated as of Chrome 143 (deprecation warnings in the console and Lighthouse) and is already disabled by default on Canary/Dev/Beta. If your site or product depends on it:
- Detect usage — watch the console, use a
ReportingObserverfor deprecation reports withbody.id === "XSLT", or the enterprise Legacy Technology Report (detection guide). - Migrate — move transformations server-side or to JSON+JS, adopt SaxonJS (full XSLT 3.0), or drop in the WASM-based polyfill (migration paths).
- Buy time — register for the “XSLT” deprecation origin trial (Chrome 152–175) or deploy the
XSLTEnabledenterprise policy; both restore the removed APIs until Chrome 176. - Test the future — toggle
chrome://flags/#xslt(all desktop/mobile OSes) to disable XSLT today and see what breaks.
at a glance
| What it is | The deprecation and staged removal of client-side XSLT 1.0 from Chrome (and, per their stated plans, from Gecko and WebKit): the XSLTProcessor JS API plus XSLT processing instructions |
|---|---|
| Milestone listing | Chrome 152 — “Stepped rollout” and “Origin trial” (the deprecation trial goes live in 152; listing verified 2026-07-29; the listing is authoritative per gendn invariant #2) |
| Key dates | Deprecated 143 (Dec 2, 2025) · pre-stable disabled from 148 · deprecation trial + enterprise policy from 152 (Aug 25, 2026) · Stable removal 158 (Nov 17, 2026) · trial/policy end 176 (Aug 17, 2027) — full timeline |
| Removed surface | XSLTProcessor interface (constructor + 8 methods) · <?xml-stylesheet type="text/xsl" ?> PI processing |
| NOT removed | XML itself, DOMParser/XMLSerializer, <?xml-stylesheet type="text/css" ?> (XML+CSS styling stays), XPath (document.evaluate) |
| Runtime feature | XSLT in runtime_enabled_features.json5: status stable, public: true, origin_trial_feature_name: "XSLT", origin_trial_type: "deprecation"; toggle at chrome://flags/#xslt |
| Usage | XSLTProcessor: ~0.01–0.1% of page loads (avg ~0.05%); XSL processing instructions: ~0.001% — above the 0.001% deprecation threshold, justified on security grounds |
| Vendor positions | Gecko supportive · WebKit cautiously supportive · web developers vocal, negative |
| ChromeStatus | 4709671889534976 — Deprecate and remove XSLT (Blink component Blink>XML, owner masonfreed@google.com) |
reference routes
XSLTProcessor— the removed JavaScript API: verbatim WHATWG DOM IDL vs Chromium's shipping IDL, per-member behavior, feature detection, and the polyfill/SaxonJS replacements.<?xml-stylesheet type="text/xsl" ?>— the removed processing-instruction behavior: grammar, what happens when disabled, what stays (CSS), and the one-line polyfill migration.- “XSLT” deprecation origin trial +
XSLTEnabledpolicy — the two sanctioned ways to keep XSLT working until Chrome 176, with exact registration and token-serving steps.
why it is being removed
Three converging reasons, per the removal guide and the Intent to Deprecate and Remove:
- Security attack surface. Chromium processes XSLT with libxslt, a complex aging C library of the type susceptible to memory-safety vulnerabilities (the guide cites CVE-2025-7425 and CVE-2022-22834). libxslt was unmaintained for ~6 months of 2025, and XSLT has been the source of recent high-profile browser exploits. A niche feature processing untrusted content receives far less security scrutiny than core JS engines.
- Stagnation. Browsers are frozen at XSLT 1.0 (1999); the language moved on to XSLT 3.0 (2017) with no browser interest in following.
- Superseded role. JSON as a wire format plus JS frameworks (React/Vue/Svelte) cover the transformation use case; measured usage is ~0.02% of page loads overall and ~0.001% for processing instructions.
Of ~220 surveyed sites using XSLTProcessor, roughly 72% still function with XSLT disabled (many have JS fallbacks such as Saxonica); of the visibly broken remainder, the polyfill restored functionality in 82% of cases — the rest mostly hit CORS limits (details).
what exactly is removed
| Component | Fate |
|---|---|
XSLTProcessor class (new XSLTProcessor() and its 8 methods) | Removed. IDL is gated [RuntimeEnabled=XSLT]; when the feature is off, window.XSLTProcessor is undefined |
<?xml-stylesheet type="text/xsl" href="..."?> (and application/xslt+xml) | Removed. The XML document renders untransformed; Chrome shows a warning banner linking to an extension search |
<?xml-stylesheet type="text/css" ?> | Kept. Styling raw XML with CSS is explicitly not part of the removal |
XML parsing (DOMParser, XMLSerializer, XMLHttpRequest.responseXML) | Kept. libxml2 is separately being replaced by a Rust XML parser, transparently to developers (gendn covers that at v151 XML parsing in Rust) |
XPath (document.evaluate) | Kept. Not part of this removal |
deprecation and removal timeline
The current plan (per the ChromeStatus record, updated 2026-07-15, and the removal guide). The original Intent (Oct 2025) proposed removal in M155 with trial/policy ending M164; the timeline was extended after feedback — the dates below are the extended, current ones. One source discrepancy is recorded honestly: the removal guide says pre-stable disabling began in M145 Canary while the ChromeStatus experiment plan says M148 (Mar 10, 2026 Canary).
| Milestone | Date | What happens |
|---|---|---|
| Chrome 142 | Oct 28, 2025 | Early-warning console messages added |
| Chrome 143 | Dec 2, 2025 | Official deprecation — deprecation warnings appear in the console and in Lighthouse |
| Chrome 145/148 | Dec 2025 / Mar 10, 2026 (Canary) | Canary, Dev, and Beta releases begin disabling XSLT by default as an early warning (guide says M145; ChromeStatus stage says M148) |
| Chrome 146 | Mar 10, 2026 | XSLTEnabled enterprise policy goes live for testing — lets enterprises test disabling early and keep XSLT past the removal date |
| Chrome 152 | Aug 25, 2026 | “XSLT” deprecation origin trial goes live (this is why the feature is in the v152 listing) — sites register to keep XSLT working past the removal date |
| Chrome 158 | Nov 17, 2026 | XSLT stops functioning on Stable for everyone except origin-trial and enterprise-policy participants |
| Chrome 176 | Aug 17, 2027 | Origin trial and enterprise policy stop functioning — XSLT disabled for all users |
As a compact checklist:
142 (2025-10-28) console early warnings
143 (2025-12-02) DEPRECATED — console + Lighthouse warnings
145/148 pre-stable channels disable XSLT by default
146 (2026-03-10) XSLTEnabled enterprise policy live for testing
152 (2026-08-25) "XSLT" deprecation origin trial live (152-175)
158 (2026-11-17) REMOVED from Stable (trial/policy holders excepted)
176 (2027-08-17) trial + policy end — disabled for everyone
Source: developer.chrome.com removal guide (timeline); ChromeStatus API record, stage experiment goals; blink-dev — Request for Deprecation Trial (Jun 2026).
how to detect XSLT usage
- Console warnings — since Chrome 143, any use of
XSLTProcessoror an XSL processing instruction logs a deprecation warning; Lighthouse also flags it. - ReportingObserver — subscribe to deprecation reports and filter on the
"XSLT"report id:
new ReportingObserver((reports, observer) => {
reports.forEach((report) => {
if (report.body.id === "XSLT") {
// XSLT usage was detected — report it back here.
}
});
}, { types: ["deprecation"], buffered: true }).observe();
- Enterprise Legacy Technology Report — admins can automatically collect deprecated-feature usage across the fleet (see the Google Support article).
- Manual feature check — when XSLT is disabled,
window.XSLTProcessoris undefined (the interface is[RuntimeEnabled=XSLT]-gated).typeof XSLTProcessor !== "undefined"is the in-page feature detect; see detection patterns.
| Mechanism | Where it works |
|---|---|
| Console + Lighthouse deprecation warnings | Chrome/Edge 143+ (other engines may coordinate their own warnings — proposed, not confirmed) |
ReportingObserver deprecation report "XSLT" | Chromium browsers supporting the Reporting API |
typeof XSLTProcessor existence check | All browsers (a plain feature detect) |
| Legacy Technology Report | Chrome Enterprise managed fleets |
migration paths
In rough order of long-term preference, per the removal guide:
| Path | When to choose it | Contract |
|---|---|---|
| Server-side transformation | You control the server and the XML pipeline | Run the XSLT on the server, ship rendered HTML; or migrate endpoints to JSON and render client-side with JS/DOM |
| JSON + JavaScript rendering | Long-term rewrite; the modern toolchain | Fetch JSON, build DOM with JS or a framework — the actively-maintained, sandboxed replacement for the client-side-transform use case |
| SaxonJS (Saxonica) | You need real, current XSLT in the browser | Full XSLT 3.0 (and upcoming 4.0) in JavaScript — far beyond the browsers' frozen 1.0 |
| XSLT polyfill | Fastest stopgap for existing code | WASM build of libxslt+libxml2; full XSLTProcessor replacement + automatic PI handling via one added <script> line — see API usage and PI usage. Known limits: CORS on xsl:include/xsl:import/document() fetches, synchronous methods fail for those cases, UTF-8 only, no-quirks-mode rendering difference. Published on npm as xslt-polyfill |
| XSLT polyfill browser extension | You cannot modify the source (e.g. unmodifiable embedded devices) | Applies the polyfill to raw XML pages with XSLT PIs or XSLTProcessor calls, user-side |
Use-case guidance from the removal guide:
- RSS/Atom feeds styled with XSLT for accidental human clicks: prefer
<link rel="alternate" type="application/rss+xml">discovery on HTML pages (HTML for humans, XML for machines); or add the one-line polyfill<script>to the feed — RSS readers still parse it because the script is a direct child of the root. - Embedded devices serving XML+PI on a LAN: update firmware to any path above if possible; otherwise the browser extension keeps client browsers working unchanged.
- XSLT-as-templating sites: polyfill now; migrate to a JS/JSON framework over time.
standards discussion and vendor positions
The standards venue is whatwg/html#11523 — “Should we remove XSLT from the web platform?” (opened Aug 2025, labeled removal/deprecation, stage: 3 — the WHATWG stage indicating broad agreement to proceed). Much of XSLT was never fully specified: the WHATWG DOM Standard carries a minimal §9 XSLT / XSLTProcessor section whose complete definition is still tracked as open work in whatwg/dom#181, and Chromium's own IDL comments that Gecko's interface definition is the closest thing to a spec.
- Gecko (smaug----): “I think this is definitely worth trying” — with a hope that all browsers ship a console warning early, citing the Mutation Events removal (discussed 2011–12, removed 2025) where warnings were inconsistent (comment).
- WebKit (annevk): “cautiously supportive” — would probably wait for one implementation to fully remove support first, possibly moving sooner against a known reverse-trial origin list; suggested coordinating a console warning (comment).
- Web developers: vocal and negative on the standards issue — XSLT works with JS disabled, and the user-side attack-surface argument is contested; alternatives proposed include adopting safer-language XSLT libraries (comment). ChromeStatus records the position as “Negative” with that context.
Existing WPT coverage under wpt.fyi/results/dom/xslt will need to change or be removed as engines remove the feature (per the ChromeStatus record).
Source: whatwg/html#11523; ChromeStatus record (vendor views, WPT description).examples
Feature-detecting the removal and falling back to the polyfill (full contract on the XSLTProcessor page):
if (typeof XSLTProcessor === "undefined") {
// Native XSLT is gone (Chrome 158+, or pre-stable channels now).
// Load the WASM polyfill, which restores window.XSLTProcessor:
await import("xslt-polyfill");
}
const processor = new XSLTProcessor();
processor.importStylesheet(xsltDoc);
const fragment = processor.transformToFragment(xmlDoc, document);
Migrating a PI-styled XML document with one line (details on the processing-instruction page):
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="demo.xsl"?>
<page>
<script src="xslt-polyfill.min.js" xmlns="http://www.w3.org/1999/xhtml"></script>
...content...
</page>
browser compatibility
XSLT 1.0 is Baseline widely available (webstatus xslt, high since 2018-01-29). BCD support for api.XSLTProcessor as of 2026-07-29 — note that BCD has not yet recorded the deprecation (status.deprecated: false); the removal columns below come from the ChromeStatus record and removal guide, not BCD:
| Browser | XSLT support (BCD) | Removal plan |
|---|---|---|
| Chrome | 1 | Deprecated 143; Stable removal 158 (Nov 17, 2026); trial/policy escape until 176 |
| Edge | 12 | Follows Chromium |
| Firefox | 1 | Removal planned — Gecko supportive; no dated plan on the record |
| Safari | 3.1 | Removal planned — WebKit cautiously supportive (waits for one engine to remove first) |
specifications
| Document | Status |
|---|---|
| WHATWG DOM Standard — §9 XSLT (XSLTProcessor) | Living standard; minimal IDL-only section — complete definition still open (whatwg/dom#181). Removal discussion at whatwg/html#11523 (stage 3) |
| XSL Transformations (XSLT) Version 1.0 | W3C Recommendation, Nov 16, 1999 — the transformation language itself; unchanged in browsers since |
| Associating Style Sheets with XML documents | W3C Recommendation — the xml-stylesheet PI grammar (CSS use remains; XSLT use is being removed) |
| Removing XSLT for a more secure browser | Chrome for Developers guide (Oct 29, 2025) — the canonical removal plan, timeline, and migration documentation |
see also
- Chrome Platform Status — Deprecate and remove XSLT (API record; metrics: XSLTProcessor, XSL processing instructions)
- blink-dev — Intent to Deprecate and Remove: XSLT (Oct 2025) · Request for Deprecation Trial (Jun 2026)
- Chromium tracking bug 435623334
- MDN — XSLTProcessor (the API as it exists today; MDN does not document the removal plan — this page exists to fill that gap)
- gendn — XML parsing in Rust for non-XSLT scenarios (v151) (the sibling libxml2→Rust work, explicitly not a removal)
- XSLT polyfill · npm · Chrome Web Store extension · SaxonJS
- Chrome Platform Showcase — interactive demos for this feature