Skip to content

Releases

Xsl3 1.3.1

Choose a tag to compare

@skuirrels skuirrels released this 06 Nov 22:12
5bd3b07

Xsl3 1.3.1

Release date: 6 November 2026. This bounded release strengthens experimental streaming verification
and separates native initialization diagnostics from the original P7 acceptance workflow.

Changes

  • Direct tests cover forward execution through both public APIs, group read/drain positions,
    retained navigator memory, fork grouping/sorting payload retention and declaration-order output.
  • Debug compilation records whether the streamed optimizer verifier actually ran and completed.
    Strict streaming CI checks that evidence and exercises a missing-verifier negative control.
  • A hidden-grounding negative control shows that a forward source and correct output alone cannot
    prove bounded memory; the retained-memory check rejects the deliberately grounded control.
  • Experimental probe URIs use HTTP to avoid incidental ICU initialization. Original input sizes,
    whole-process memory budgets and throughput targets remain unchanged.
  • Native initialization tracing has a separate workflow and Linux PR check. The daily/manual
    P7 memory and throughput acceptance workflow is preserved unchanged.

The merged verification increments are recorded in PR #33,
PR #34, PR #35,
PR #36, PR #37
and PR #38.

Verification and limits

The release workflow builds, tests and packs the tagged source before the owner's required NuGet
publication review. Ordinary CI covers the unit, upstream, differential, W3C, NativeAOT and
micro-performance checks. The diagnostic is evidence collection, not an acceptance result.

Full streaming remains experimental and unsupported. Default execution stays tree-based,
forward execution requires the existing development opt-in, and supports-streaming remains no.
The separate integrated runtime qualification branch is not included in this release. This release
does not claim that all original P7 memory and throughput gates pass or that P7 is complete.

Update Xsl3, Xsl3.Build and Xsl3.Cli together to 1.3.1 and regenerate saved stylesheets
using matching compiler/runtime packages.

Xsl3 1.3.0

Choose a tag to compare

@skuirrels skuirrels released this 04 Nov 09:28
f9708eb

Xsl3 1.3.0

Release date: 4 November 2026. This release names the five extensions that strict streamability analysis
applies to the XSLT 3.0 rules and adds a setting to turn them off. Full streaming remains experimental and
unsupported.

New setting

XsltSettings.StreamabilityExtensions (default true) controls five extensions to the §19 analysis that
earlier releases already applied with no way to turn them off:

  • E//N analysed as E/descendant::N, for example .//x, $p//x and a[1]//x;
  • a scanning expression that starts with .;
  • a quantified expression over streamed nodes whose condition is motionless, such as
    some $x in doc/a satisfies $x/@k = '2';
  • S except ., which stays striding;
  • current-group() over a grounded selection, which is motionless wherever it is used.

XSLT 3.0 §19.10 allows a processor to extend the streamability rules only when the user asks for it. The
W3C test suite and both streaming processors in the W3C implementation report expect these forms to be
streamable, so the default is unchanged: 101 W3C strict streaming cases depend on them and none expects them
off. Set the property to false for the specification's analysis exactly; such constructs then raise
XTSE3430 under the default Strict mode, or run unstreamed under Fallback.

Nothing changes for existing stylesheets. The extension review records
the specification text, the W3C cases and the owner decision.

Verification and limits

W3C strict streaming is unchanged at 2,696 of 2,712 cases (99.41%), and 2,595 with the extensions off.
Full .NET 8 and .NET 10 unit suites, upstream, differential, W3C, NativeAOT and the performance gate run in
PR #30 checks. The
release workflow builds and tests the
tagged source before the owner's required NuGet deployment review.

Three P7 phase A items now have direct tests, with no engine change. S3-18: the optimizer's streamed
policy is shown to keep the reads that its ordinary loop-hoisting and inlining rewrites would move.
S3-27: a streamable stylesheet forced onto the tree path still passes its output check but loses its
recorded forward source, and the strict forwarding audit rejects it. S4-21, S4-24 and S4-25:
inspection, ascent and deep-descent stylesheet functions called from streamable template rules write
their first result before half the input is read, through both XslCompiledTransform and
XsltCompiler. Grounding inside a forward run is still not detectable, and the 253 W3C cases that do
not forward stay dispositioned rather than failed. See PR #32
and the phase A record.

Default execution stays tree-based and supports-streaming remains no. The original streaming RSS and
throughput gates are still unmet; this release does not claim full P7 completion.

Update Xsl3, Xsl3.Build and Xsl3.Cli together to 1.3.0 and regenerate saved stylesheets
using matching compiler/runtime packages.

Xsl3 1.2.0

Choose a tag to compare

@skuirrels skuirrels released this 02 Nov 19:18
3ea172a

Xsl3 1.2.0

Release date: 2 November 2026. This release makes strict streamability analysis follow the XSLT 3.0
rules for unions and records P7 phase A. Full streaming remains experimental and unsupported.

Breaking change

A union of two striding operands is crawling (XSLT 3.0 §19.8.8.4), even when both are child steps from
the same parent, such as (/BOOKLIST/ITEM | /BOOKLIST/MAGAZINE)/PRICE. Earlier releases treated such
unions as striding. That is an extension, which §19.10 allows only when the user asks for one, and there
was no way to ask.

XsltSettings.Streamability = Strict is the default, so a declared-streamable template, mode,
xsl:source-document or other construct that relied on the extension, and compiled with 1.1.7, now
raises XTSE3430 at compile time. Either:

  • select XsltStreamabilityMode.Fallback, which runs the construct with ordinary tree-based execution, or
  • write the selection as one striding step, for example /BOOKLIST/*[self::ITEM or self::MAGAZINE]/PRICE.

See the migration guide.

Other changes

  • P7 phase A evidence: retained-state bounds for xsl:iterate parameters, adjacent grouping and
    node-valued accumulators through both public APIs, and failing-prong cancellation in a compiled
    xsl:fork (later prongs are cancelled; earlier prongs finish so the error follows declaration order).
  • CI accounts for the original S3-S7 conformance exits on every run and fails if a stage regresses
    against unstreamed execution or a strict failure has no recorded disposition.
  • The XSLT 3.0 test runner honours directory collections, so W3C merge-039 runs and passes.

Verification and limits

W3C strict streaming: 2,696 of 2,712 cases pass (99.41%) with every failure recorded in
the phase A dispositions; sx-union-202 now passes and
sx-union-315, whose fixture relies on the removed extension, fails. Full .NET 8 and .NET 10 unit suites,
upstream, differential, W3C, NativeAOT and the performance gate run in
PR #28 checks. The
release workflow builds and tests the
tagged source before the owner's required NuGet deployment review.

Default execution stays tree-based and supports-streaming remains no. The original streaming RSS and
throughput gates are still unmet; this release does not claim full P7 completion. Five other compiler
streamability extensions remain on and are due for the same §19.10 review (see
P7 phase A).

Update Xsl3, Xsl3.Build and Xsl3.Cli together to 1.2.0 and regenerate saved stylesheets
using matching compiler/runtime packages.

Xsl3 1.1.7

Choose a tag to compare

@skuirrels skuirrels released this 01 Nov 22:00
b0bf3bb

Xsl3 1.1.7

Release date: 1 November 2026. This release closes a bounded P7 runtime correctness and allocation checkpoint.
Full streaming remains experimental and unsupported.

Changes

  • Correct copied accumulator applicability and phase provenance, including schema-created text and
    copy-accumulators with stripped types. Preserve schema default/fixed text around comments and processing instructions.
  • Strengthen fork ownership, immutable headers, independent schema snapshots, cancellation and caller-owned
    input/output. Reduce handoff overhead without changing configured buffers or thread counts.
  • Reduce allocation in dynamic calls, accumulator matching, compact-tree value storage and grounded
    adjacent groups. Large tree columns use pages to avoid whole-column resize peaks.
  • Preserve canonical streamed atomization, string joining and stripped attribute-copy semantics.
  • Reject saved named functions with unavailable name/arity bindings. Keep schema/typed-node saved layouts
    compatible while recording optional accumulator-filter metadata.
  • Strengthen physical-read, first-output, lifetime and conformance evidence, with original inputs,
    fingerprints, error codes and memory/throughput targets retained.

Default execution stays tree-based, as in earlier published releases. XsltSettings.Streamability = Strict
controls static checking and does not enable experimental forward execution by itself. The development
opt-in remains available for qualification. Saved styles retain their recorded execution mode.
supports-streaming remains no.

The internal Linux NativeAOT probe uses packed relative relocations and requires LLD/glibc 2.36+.
Consumer libraries, CLI and build packages retain their existing platform requirements.

Verification and limits

The release gates cover full .NET 8/10 Release/Debug unit suites, upstream and differential tests,
ordinary W3C conformance, NativeAOT and the ordinary performance gate. See
PR #27 checks for reviewed-source CI.

Coordinated release packages are checked for version/commit metadata, both target frameworks,
package-only managed consumers, saved compilation through Xsl3.Build, CLI/tool execution and NativeAOT.
The release workflow builds and tests
the tagged source before the owner's required NuGet deployment review. GitHub and NuGet publication
are verified separately from source merge.

The original experimental streaming RSS and throughput gates are still unmet. This checkpoint does
not advertise general constant-memory streaming or full P7 completion. Isolated optimization experiments
that were not adopted into PR #27 are excluded. See the checkpoint boundary
and full development evidence.

Update Xsl3, Xsl3.Build and Xsl3.Cli together to 1.1.7 and regenerate saved stylesheets
using matching compiler/runtime packages. The P7H Debug compiler source-line fix remains included.

Xsl3 1.1.6

Choose a tag to compare

@skuirrels skuirrels released this 29 Oct 18:37

Xsl3 1.1.6

Release date: 29 October 2026. This patch closes the bounded P7H Debug compiler source-line contracts.

Changes

Repeated bare-variable sequences such as xsl:sequence select="$value" now receive distinct
instruction nodes before source-line metadata is attached. The variable keeps its original binding
and initializer location; each use keeps its own sequence point. This removes the Debug compiler's
"Attempt to override SourceLineInfo in debug mode" assertion without suppressing that check.

The correction uses the existing XSLT 1.0 compiler's reference-wrapper pattern at the instruction
source-location boundary. It does not clone or re-evaluate the variable. No public API, saved-format,
DTD identity, annotation policy or runtime feature claim changes.

The original six P7G contracts retain their inputs and expected results. A separate fixture variant
restores $second instead of $second/self::attribute(). Both remain covered, including initial
and positioned readers, both DTD forms, both public source APIs and grounded/forward execution.

Verification

Full managed Release/Debug suites pass 4,342 / 3,989 tests on .NET 10 / .NET 8 in each configuration.
The original P7G cohort and bare-variable styles generated by Release/Debug compilers pass 1,728
saved consumer checks across .NET 8, .NET 10 and macOS ARM64 NativeAOT. Upstream, differential,
ordinary conformance and raw/reviewed analysis gates pass with original failure inventories retained.
The unchanged three-round ordinary performance gate passes against 1.1.5 with time geometric mean
1.000108 across 39 gated rows and maximum allocation ratio 1.000815.

Linux, Windows, NativeAOT and performance checks passed for the reviewed source on
PR #26; see its
CI run.

See the close-out evidence for exact gates and provenance.

See the frozen plan for gates and stopping criteria.
The independent stylesheet-reader source-mapping finding remains deferred.
Streaming remains unsupported; the 20 MiB memory target and full P7 remain deferred.

Update Xsl3, Xsl3.Build and Xsl3.Cli together to 1.1.6 and regenerate saved stylesheets
with matching compiler/runtime packages.

Xsl3 1.1.5

Choose a tag to compare

@skuirrels skuirrels released this 29 Oct 16:15
54df5c5

Xsl3 1.1.5

Release date: 29 October 2026. This patch closes the bounded P7G copied-attribute identity phase.

Changes

DTD-declared ID, IDREF and IDREFS attributes now retain their identity properties when loaded
through XDM/XSLT 2.0+ readers, copied into an attribute()* variable and inserted into a new document.
Both validation="preserve" and validation="strip" keep those properties. Input with ATTLIST-only
declarations and readers already positioned past the DOCTYPE receive the same treatment. Experimental
forward execution carries the DTD declarations into copied and grounded nodes.

The corrections distinguish identity from schema type annotations: stripping annotations must not
strip identity. Detached attributes remain parentless and distinct, keep their names/values, and
remain usable after the source reader closes. xml:id normalization and borrowed-reader ownership
are preserved. XSLT 1.0 and direct stock-compatible compact loading retain their existing policy.

There is no public API or saved-format change. P7F's optimization for ordinary untyped attributes is
retained. New normal/debug saved consumers exercise all six contracts on .NET 8, .NET 10 and NativeAOT.
See the bounded plan for completion criteria.

Review also preserves typed identity facts through intermediate reader views independently of type
annotations, forwards them through positioned scopes, and registers overlapping metadata once.

Verification

All six contracts pass 330 / 234 managed regression rows on .NET 10 / .NET 8 in Release and
Debug. Full managed units pass 4,044 / 3,787 in each configuration; upstream, differential,
ordinary conformance and reviewed S1/S2 checks pass with existing raw failure inventories retained.
The 24 saved styles pass 192 checks on each managed framework and macOS ARM64 NativeAOT,
including actual execution-mode verification and a missing-case negative control.

The macOS ARM64 three-size allocation comparison against 1.1.4 passes all 18 fresh processes at 10 MiB,
200 MiB and 2 GiB, retaining the P7F gain. The unchanged ordinary three-round performance gate passes
with time geometric mean 0.970 and maximum allocation ratio 1.001139. These are workload-specific
measurements; they do not establish supported streaming or memory-budget acceptance.

See the close-out, exact snapshot
and PR #25 checks.

Boundaries

Streaming remains unsupported, normal execution remains tree-based and supports-streaming remains
no. Startup footprint, the 20 MiB memory target, new streaming constructs and broader schema work
are excluded. The pre-existing Debug compiler line-information finding is deferred.

Update Xsl3, Xsl3.Build and Xsl3.Cli together to 1.1.5 and
regenerate saved stylesheets with matching compiler/runtime packages.

Xsl3 1.1.4 — P7F attribute-copy allocation reduction

Choose a tag to compare

@skuirrels skuirrels released this 29 Oct 10:58
09af4ab

Xsl3 1.1.4

Release date: 29 October 2026. This patch closes the bounded P7F attribute-copy allocation phase and
includes P7E's diagnostic tooling and audit. It does not claim supported streaming.

Changes

Ordinary untyped native attribute copies now use a minimal compact fragment instead of allocating a
general tree builder and unused child buffers. Each copy retains independent parentless node identity,
its name and value. Typed, DTD identity-sensitive and xml:id attributes retain their existing copy
policies. No public API or saved-format change is introduced.

In the measured identity workload, transformation allocation falls 23.55% at each of the original
10 MiB, 200 MiB and 2 GiB input sizes on Linux x64 and macOS ARM64. Separate uninstrumented median
timings improve 4.53–7.21%. All 72 comparison processes consume the full input and validate
independent output fingerprints. These results apply to that workload; cumulative allocation is not
retained memory or whole-process RSS.

P7E's source-frozen 1.1.3 audit, original failed cohorts, paired diagnostics and measurement safeguards
are included. Scheduled/default memory limits and canonical workloads remain unchanged. P7D validation
contracts and P7C source-reader boundary corrections remain included.

See the P7F close-out
and exact result snapshot
for raw evidence provenance, exact medians and limitations.

Verification

  • Managed Release/Debug: 3,710 / 3,549 tests pass on .NET 10 / .NET 8.
  • Upstream applicable tests and byte-for-byte differential 394/394 pass on both frameworks.
  • Ordinary conformance retains QT3 21,884/0/99, XSLT 2.0 4,590/8/10 and XSLT 3.0 8,850/18/41.
  • Reviewed S1 1,000/0/0 and S2 155/0/0 pass in Release and Debug; original raw results remain retained.
  • Strict-forward remains 2,695/16/1, with zero unmatched expected errors and the complete original population.
  • Retained saved entrypoints pass managed .NET 8/10 and NativeAOT checks. Focused copy regressions also
    compile and load normal/debug saved stylesheets. All 24 controller/diagnostic/comparison tests pass.
  • The ordinary performance gate passes without a waiver. The local 39-row time geometric mean is 1.021;
    individual slower compilation rows remain recorded in the close-out.

PR #23 passed
Linux, Windows, NativeAOT and performance CI.
The separate experimental measurement run
passes allocation/throughput comparison and the large memory matrix; its small memory job correctly fails.

Upgrading

Update all three packages together:

dotnet add package Xsl3 --version 1.1.4
dotnet add package Xsl3.Build --version 1.1.4
dotnet tool update --global Xsl3.Cli --version 1.1.4

The packages support .NET 8 and .NET 10. Compiling saved stylesheets requires the .NET 10 SDK;
saved stylesheets also run under NativeAOT. Runtime compilation requires dynamic code.
Regenerate saved stylesheets with matching compiler/runtime packages. Existing saved formats remain
supported; no new public helper signature or format is introduced by P7F.

Remaining limits

Streaming remains unsupported, normal execution remains tree-based and supports-streaming remains no.
Both complete 2 GiB / 200 MiB memory matrices pass 16/16. The original 200 MiB / 20 MiB matrix
remains 0/16 on Linux and records 12/16 on macOS, versus the retained P7E macOS 13/16.
The additional accumulator outer-RSS failure is retained alongside three passing paired repeats;
those repeats do not replace the original failed matrix or relax the limit.

The unrelated DTD identity roundtrip finding is
deferred to its own contract investigation.
Startup footprint, other allocation hotspots and full P7 memory/throughput acceptance remain separate work.

Release preparation passed all four checks: https://github.com/skuirrels/Xsl3/actions/runs/40856588045.
Release build and publication: https://github.com/skuirrels/Xsl3/actions/runs/40859743745.

Xsl3 1.1.3

Choose a tag to compare

@skuirrels skuirrels released this 28 Oct 20:11
7bf3dd6

1.1.3: P7D schema-validation contracts

Version 1.1.3 closes the bounded six-case P7D phase.
Normal execution remains tree-based; streaming remains experimental and unsupported, and
system-property('xsl:supports-streaming') remains no.

Changes

  • With XsltSettings.SchemaAware=false, treat validation="lax" as stripping annotations rather than
    rejecting the stylesheet with XTSE1660. Both public APIs and saved stylesheets support the corrected
    contract for source and result documents.
  • Apply an explicit strip policy to grounded source documents, including basic lax/preserve
    normalization. Inputs from validating readers become untyped as requested. Experimental forward
    execution retains the same annotation policy and borrowed-reader ownership.
  • Apply whitespace rules after stripping annotations and initialize filtering through the shared
    scoped view for positioned 2.0+ readers. Retain xml:space, namespace bindings, IDs/IDREFs and
    document URIs; keep the legacy 1.0 path unchanged.
  • Document the distinction between schema-aware lax validation (xs:anyType without declarations),
    basic stripping (xs:untyped), supplied annotations and explicit imports for strict validation.

The three original lax fixtures pass in basic mode after failing with XTSE1660 on the independently
rebuilt 1.1.2 runtime. All six raw schema-aware outcomes remain visible with
individual dispositions; no official fixture, expectation or existing
baseline is changed. No public API, helper signature or saved-format change is introduced.

Verification

  • Full Release and Debug managed units: 3,698 .NET 10 / 3,541 .NET 8 in each configuration,
    including 64 / 60 new contract cases after review.
  • Upstream 1,654 on Linux / 1,661 on Windows and byte-for-byte differential 394 tests per framework.
  • W3C harness 71 passed; ordinary XSLT 3.0 8,850/18/41 and QT3 21,884/0/99, with existing failure sets.
  • Strict-forward 2,695/16/1, complete 2,712-case coverage and zero unmatched expected-error codes.
  • P7B reviewed S1 1,000/0/0 and S2 155/0/0 in Release/Debug; original raw results retained.
  • 28 fresh normal/debug grounded/forward saved styles: 56 checks per .NET 8, .NET 10 and
    NativeAOT consumer across two inputs. The 52 retained P7C checks also pass on each consumer.
    Native publication uses globalization and treats publish/trim/AOT warnings as errors.
  • Review adds 18 normal/debug saved styles and 36 checks per managed/native consumer for
    stripped/preserved whitespace, basic lax processing, xml:space and source identity metadata.

The implementation PR passed
Linux, Windows, NativeAOT and performance CI.
Main CI also passed after merge.
The hosted timing geometric mean is 0.986 against the base branch; the separate local three-round
result against 1.1.2 is 1.002463, with maximum allocation ratio 1.002233. Individual compilation
outliers remain recorded in the close-out. No benchmark limit is relaxed.

Upgrading

Update all three packages together:

dotnet add package Xsl3 --version 1.1.3
dotnet add package Xsl3.Build --version 1.1.3
dotnet tool update --global Xsl3.Cli --version 1.1.3

The packages support .NET 8 and .NET 10. Compiling saved stylesheets with Xsl3.Build requires the
.NET 10 SDK; saved stylesheets also run under NativeAOT. Runtime compilation requires dynamic code.
Regenerate affected saved stylesheets with
matching compiler/runtime versions. Regeneration is required to compile the corrected grounded strip
path; previously emitted code is not rewritten by a runtime update. Existing saved formats remain supported.

The schema-aware setting remains opt-in. Strict validation in basic mode still raises XTSE1660.
XsltSettings.Schemas remains an import catalog; it does not implicitly import declarations for explicit
strict validation. Preserving an already validated reader's annotations does not require that import.
See the migration guide.

Deferred scope

General streaming runtime bounds, the original 20 MiB memory target, throughput acceptance, new streaming
constructs, XSD 1.1 and public API expansion remain deferred. P7D does not reopen P7C or complete full P7.

Packages

Release checks

The release-preparation CI passed Linux, Windows, NativeAOT and performance checks (timing ratio 0.999). The release workflow built and tested the tagged source. Attached packages and checksums are the artifacts from that workflow.

Xsl3 1.1.2

Choose a tag to compare

@skuirrels skuirrels released this 27 Oct 17:10
e98cc9f

1.1.2: P7C input-boundary correctness

Version 1.1.2 closes P7C, the bounded positioned source-reader correctness phase.
Streaming remains experimental and unsupported. Normal execution builds trees and
system-property('xsl:supports-streaming') continues to return no.

Changes

  • Restrict an XmlReader positioned on an element to that subtree during experimental
    xsl:source-document execution. Following siblings are excluded. For example, selecting the
    first doc in <outer><doc/><doc><record/></doc></outer> now reports zero records rather than one.
  • Preserve inherited namespace bindings used only in QName values when scoping source and
    initial readers, including transparent reader wrappers. Retain schema annotations and the
    requested preserve/strip/validation policy.
  • Keep borrowed readers open at the selected element's boundary after success, early exit or
    a body error, while retaining the existing cleanup policy for owned inputs.
  • Retain the complete strict-forward failure inventory in CI. The gate also rejects lost passing
    cases, new or changed skips, and unmatched expected-error codes. It permits genuine fixes
    through the existing failure-baseline review process.

No public API or saved-assembly format changes are introduced. Original W3C fixtures and
P7B raw/reviewed analysis results remain unchanged.

Verification

The implementation PR passed Linux and Windows
regression tests, NativeAOT and the unchanged ordinary performance gate.
Main CI also passed after merge.

Check Result
Release and Debug managed units 3,634 on .NET 10 / 3,481 on .NET 8 in each configuration
New P7C boundary cases 50 on .NET 10 / 48 on .NET 8, plus five coverage-guard harness regressions
Upstream / byte-for-byte differential 1,654 / 394 per framework
W3C harness with saved round trips 71 passed
Ordinary XSLT 3.0 / QT3 8,850/18/41 and 21,884/0/99; existing failure IDs retained
Strict-forward experimental profile 2,695 passed / 16 retained failures / 1 collection skip; zero unmatched expected-error codes
Reviewed P7B S1 / S2 1,000/0/0 and 155/0/0 in Release and Debug
Saved normal/debug styles 52 checks each on .NET 8, .NET 10 and macOS ARM64 NativeAOT

The 2,712-case strict-forward scope is a regression gate, not full streaming conformance.
The 16-case deferred inventory preserves runtime obligations
and fixture/specification conflicts separately. The original 919-case analysis result remains
790 passed / 129 failed; raw static diagnostics remain 153 passed / 2 failed.

The hosted ordinary performance gate passes with a rounded timing geometric mean of 1.010
against the base branch. The separate local three-round result is 0.995962, with maximum
allocation ratio 1.000156. Individual timing outliers remain in the
close-out; an aggregate pass is not a per-row performance win.

Upgrading

Update all three packages together and regenerate saved stylesheets with matching compiler/runtime versions:

dotnet add package Xsl3 --version 1.1.2
dotnet add package Xsl3.Build --version 1.1.2
dotnet tool update --global Xsl3.Cli --version 1.1.2

The packages support .NET 8 and .NET 10. Compiling saved stylesheets with Xsl3.Build requires the
.NET 10 SDK; saved stylesheets run on .NET 8 and later and under NativeAOT. Runtime compilation
still requires dynamic code. Existing Strict/Fallback analysis defaults are unchanged.

Resolvers returning positioned readers now expose only their selected element in the experimental
forward path. Code that relied on following siblings being included must explicitly select the
intended input instead. See the migration guide.

Deferred scope

Full-P7 runtime completion, general retained-model bounds, the 200 MiB input / 20 MiB absolute
memory target and streaming throughput acceptance remain deferred. This patch does not enable
supported streaming, expand public APIs, alter saved formats, or change benchmark inputs or limits.

See the changelog, P7C close-out,
result snapshot and original P7 plan.

Packages

Xsl3 1.1.1

Choose a tag to compare

@skuirrels skuirrels released this 27 Oct 13:01

1.1.1: P7B analysis close-out

Version 1.1.1 closes P7B, the bounded streamability-analysis follow-up to the 1.1.0 foundations.
Normal execution remains tree-based. Streaming remains experimental and unsupported;
system-property('xsl:supports-streaming') continues to return no.

Changes

  • Apply XSLT 3.0 §3.9.1 to instructions processed with XSLT 1.0 behavior inside declared-streamable content.
    Strict analysis now rejects these with XTSE3430, even when their bodies are motionless.
  • Preserve source streamability diagnostics before lowering rejected units. Debug xsl:number validation
    and Explain recompilation report the static errors rather than masking them with lowering failures.
  • Keep the developer tool's qil and qilopt diagnostics when a rejected compilation produces no QIL;
    these commands exit with failure and emit no QIL.
  • Complete the owner-approved reviewed fixtures with independent specification-based expectations,
    canonical-input-derived positive results, complete expression mappings, integrity checks and separate CI reports.
    Reviewed S2 requires the primary structured static code, source location and reason, or a checked positive XML result.

Analysis evidence

The reviewed fixtures are a project-approved correction of the pinned upstream data. They are reported
separately from the unchanged official suite; their results do not establish full W3C streaming conformance.

Gate Passed Failed Not run
Original posture/sweep suite 790 129 0
Reviewed posture/sweep suite, Release and Debug 1,000 0 0
Original exact static-diagnostic/result audit 153 2 0
Reviewed static-diagnostic/result audit, Release and Debug 155 0 0

All 66,643 original expressions are conserved with their part IDs and namespace bindings. Eight empty
generator outputs remain recorded as invalid source fixtures and negative checks. Reviewed S2 preserves
152 exact static-code checks and three positive XML results. The two raw S2 discrepancies remain visible.

The implementation PR passed Linux and Windows regression tests,
NativeAOT and the unchanged performance gate. Main CI
also passed after merge. Ordinary XSLT 3.0 is 8,850 passed / 18 failed / 41 not run, with 34 unmatched-code
passes tracked separately; QT3 is 21,884 / 0 / 99, with 25 unmatched-code passes. Exact counts and the
raw/reviewed distinction are retained in the P7B close-out.

Upgrading

Update Xsl3, Xsl3.Build and Xsl3.Cli together to 1.1.1. Regenerate saved stylesheets with matching
compiler/runtime packages. This patch adds no public API or saved-assembly format changes. Runtime compilation
still requires dynamic code; NativeAOT consumers use saved stylesheets.

dotnet add package Xsl3 --version 1.1.1
dotnet add package Xsl3.Build --version 1.1.1
dotnet tool update --global Xsl3.Cli --version 1.1.1

Stylesheets relying on a version="1.0" instruction inside a declared-streamable mode or source-document
may now receive XTSE3430. Remove the streamability declaration when tree execution is intended, explicitly
select Fallback, or update the instruction version when the 2.0/3.0 semantics are appropriate:

var settings = new XsltSettings
{
    Streamability = XsltStreamabilityMode.Fallback
};

Fallback controls the analysis policy and permits ordinary tree execution. Ordinary non-streamable
backwards-compatible behavior is retained. See the migration guide.

Deferred scope

Full-P7 runtime completion, general retained-model bounds, the 20 MiB absolute memory target and streaming
throughput acceptance remain deferred. Their unchanged experimental checks are separate from supported release
CI. P7B completion makes no supported streaming, memory-budget or universal performance claim.

See the changelog, P7B results and
original P7 plan.

Packages