PhoenixmlDb.Xslt
1.6.1
dotnet add package PhoenixmlDb.Xslt --version 1.6.1
NuGet\Install-Package PhoenixmlDb.Xslt -Version 1.6.1
<PackageReference Include="PhoenixmlDb.Xslt" Version="1.6.1" />
<PackageVersion Include="PhoenixmlDb.Xslt" Version="1.6.1" />
<PackageReference Include="PhoenixmlDb.Xslt" />
paket add PhoenixmlDb.Xslt --version 1.6.1
#r "nuget: PhoenixmlDb.Xslt, 1.6.1"
#:package PhoenixmlDb.Xslt@1.6.1
#addin nuget:?package=PhoenixmlDb.Xslt&version=1.6.1
#tool nuget:?package=PhoenixmlDb.Xslt&version=1.6.1
PhoenixmlDb.Xslt
XSLT 4.0 transformation engine for PhoenixmlDb — transform XML documents into HTML, JSON, CSV, text, or other XML formats.
Features
- XSLT 3.0/4.0 — template matching, streaming, accumulators, packages, maps/arrays
- All output methods — HTML5, XML, XHTML, JSON, text, CSV, adaptive
- Multiple outputs —
xsl:result-documentfor multi-file generation - Full XPath 4.0 — 240+ built-in functions available in all expressions
- Packages — reusable stylesheet libraries with visibility control
Quick example
using PhoenixmlDb.Xslt;
var transformer = new XsltTransformer();
await transformer.LoadStylesheetAsync(
File.ReadAllText("style.xsl"),
new Uri(Path.GetFullPath("style.xsl")));
transformer.SetParameter("title", "My Report");
var html = await transformer.TransformAsync(
File.ReadAllText("data.xml"));
// Handle secondary outputs (xsl:result-document)
foreach (var (href, content) in transformer.SecondaryResultDocuments)
File.WriteAllText(Path.Combine(outputDir, href), content);
See the full API overview in the README.
Related packages
| Package | Description |
|---|---|
| PhoenixmlDb.Core | Core types and XDM data model (dependency) |
| PhoenixmlDb.XQuery | XQuery 4.0 query engine (dependency) |
| PhoenixmlDb.Xslt.Cli | xslt command-line tool |
Documentation
Full documentation at phoenixml.dev
License
Apache 2.0
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net10.0
- PhoenixmlDb.Core (>= 1.3.0)
- PhoenixmlDb.XQuery (>= 1.6.1)
-
net8.0
- PhoenixmlDb.Core (>= 1.3.0)
- PhoenixmlDb.XQuery (>= 1.6.1)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 1.6.1 | 98 | 8/4/2026 |
| 1.6.0 | 104 | 7/31/2026 |
| 1.5.0 | 124 | 7/27/2026 |
| 1.4.25 | 101 | 7/17/2026 |
| 1.4.24 | 86 | 7/14/2026 |
| 1.4.23 | 126 | 7/12/2026 |
| 1.4.22 | 105 | 7/10/2026 |
| 1.4.21 | 107 | 7/9/2026 |
| 1.4.20 | 100 | 7/9/2026 |
| 1.4.19 | 97 | 7/9/2026 |
| 1.4.18 | 96 | 7/8/2026 |
| 1.4.17 | 102 | 7/7/2026 |
| 1.4.16 | 128 | 6/30/2026 |
| 1.4.15 | 106 | 6/25/2026 |
| 1.4.14 | 114 | 6/22/2026 |
| 1.4.13 | 120 | 6/21/2026 |
| 1.4.12 | 109 | 6/19/2026 |
| 1.4.11 | 113 | 6/18/2026 |
| 1.4.10 | 121 | 6/17/2026 |
| 1.4.9 | 120 | 6/17/2026 |
### Fixes
- **A typed global `xsl:variable`/`xsl:param` with an optional type (`as="xs:T?"` / `as="xs:T*"`) whose sequence-constructor body executes but produces nothing now binds the empty sequence, not the empty string.** A body such as `<xsl:if test="…">` that does not fire, or `<xsl:for-each select="()">`, produced no content; for a type that permits the empty sequence the value must be `()`. The engine bound `""`, so a later value comparison atomized the variable as `xs:string` and raised a spurious `XPTY0004` (e.g. `$v lt 65536`). Both the eager and the lazily-initialized global-binding paths are corrected; the local-variable path already behaved correctly. Reported by Martin Honnen (XSpec `version-utils.xsl` `x:saxon-version`, which is empty for a non-Saxon processor). Requires the companion PhoenixmlDb.XQuery release for full XPath 3.1 §3.7.1 empty-operand comparison semantics, but this fix alone resolves the reported error.
- **A single-step `node()` kind-test pattern with a predicate (e.g. `match="node()[self::x]"`) now evaluates the predicate instead of matching on node kind alone.** The engine short-circuited on node kind for `node()`, silently dropping any predicate, so `node()[pred]` behaved like bare `node()` — matching nodes the predicate should reject and, at higher priority, pre-empting more specific template rules. Now mirrors the (already-correct) `root()` pattern handling. Reported by Martin Honnen (XSpec `gather-specs.xsl`, `match="node()[x:is-user-content(.)]"`). The sibling `document-node()[pred]` / `document-node(element(E))[pred]` forms had the same predicate-dropping short-circuit and are fixed alongside it. No effect on bare `node()`/`document-node()` or on `element()`/`attribute()`/name-test patterns.
### Packaging
- Exception stack traces from shipped assemblies no longer embed the absolute build-machine path (a `PathMap` maps the repo root to a repo-relative prefix, so a frame reads `phoenixmldb-xslt/src/…` instead of a local filesystem path). Line numbers are preserved. Release builds only.