xquery4 1.6.2
See the version list below for details.
dotnet tool install --global xquery4 --version 1.6.2
dotnet new tool-manifest
dotnet tool install --local xquery4 --version 1.6.2
#tool dotnet:?package=xquery4&version=1.6.2
nuke :add-package xquery4 --version 1.6.2
xquery
Command-line XQuery 3.1/4.0 processor for .NET. Query XML documents from the terminal using the PhoenixmlDb XQuery engine.
Installation
dotnet tool install -g xquery4
Usage
# Query an XML file
xquery '//book/title' library.xml
# Count elements
xquery 'count(//item)' catalog.xml
# Read from a query file
xquery -f transform.xq input.xml
# Query a directory of XML files
xquery 'collection()//product[price > 50]' ./data/
# JSON output
xquery -o json 'map { "count": count(//item) }' data.xml
# Read from stdin
cat data.xml | xquery '//item/@name'
# Show execution plan
xquery --plan 'for $x in 1 to 10 return $x * $x'
# Show timing breakdown
xquery --timing '//item' large-catalog.xml
Features
- XQuery 3.1/4.0 — FLWOR, maps/arrays, higher-order functions, string constructors
- Multiple output methods — adaptive, XML, text, JSON
- Context item — input XML is available as
.(standard XQuery) - Multiple sources — files, directories, URLs, stdin
- Full prolog support — namespaces, variable/function declarations, serialization options
- Execution plans — inspect how queries are compiled and optimized
- Timing — built-in performance profiling
Documentation
Full documentation at phoenixml.dev
License
Apache-2.0
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | 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. |
This package has no dependencies.
| Version | Downloads | Last Updated |
|---|---|---|
| 1.6.8 | 0 | 8/26/2026 |
| 1.6.7 | 55 | 8/24/2026 |
| 1.6.6 | 63 | 8/23/2026 |
| 1.6.5 | 60 | 8/21/2026 |
| 1.6.2 | 78 | 8/16/2026 |
| 1.6.1 | 72 | 7/31/2026 |
| 1.6.0 | 82 | 7/27/2026 |
| 1.5.5 | 90 | 7/12/2026 |
| 1.5.4 | 79 | 7/9/2026 |
| 1.5.3 | 81 | 7/8/2026 |
| 1.5.2 | 80 | 7/7/2026 |
| 1.5.1 | 94 | 6/30/2026 |
| 1.5.0 | 80 | 6/28/2026 |
| 1.4.7 | 87 | 6/25/2026 |
| 1.4.6 | 96 | 6/17/2026 |
| 1.4.5 | 91 | 6/17/2026 |
| 1.4.4 | 86 | 6/14/2026 |
| 1.4.3 | 88 | 6/10/2026 |
| 1.4.2 | 88 | 6/6/2026 |
| 1.4.1 | 96 | 6/4/2026 |
### Fixes
- **`fn:QName` now accepts the `xs:string` subtypes for either argument.** Under the function conversion rules `fn:QName($paramURI as xs:string?, $paramQName as xs:string)` accepts any value whose type derives from `xs:string` — the XSD chain being `xs:string > xs:normalizedString > xs:token > { xs:language, xs:NMTOKEN, xs:Name }` and `xs:Name > xs:NCName > { xs:ID, xs:IDREF, xs:ENTITY }`. Those subtypes are carried by a typed-string wrapper rather than a bare string (so `xs:normalizedString("x") instance of xs:token` can answer correctly), and the argument guard tested only for the plain string and `xs:untypedAtomic` forms. Every subtype was rejected with `XPTY0004`, including `xs:NCName` — the natural thing to build a QName from. Surfaced via XSpec's compiler, where this single error accounted for 56 of its 162 XSLT suites.
- **`fn:namespace-uri-for-prefix` now resolves against the element's in-scope namespaces, not only the bindings it declares itself.** Per F&O §14 the in-scope set includes bindings inherited from ancestors; the implementation read only the element's own declarations plus its own prefix, so an inherited prefix returned the empty sequence while `fn:in-scope-prefixes` — which does walk ancestors — listed it. That breaks the idiomatic namespace copy `for-each(in-scope-prefixes($e)) { xsl:namespace name="{.}" select="namespace-uri-for-prefix(., $e)" }`, which raised `XTDE0930` ("zero-length string, but a prefix was specified") on the first inherited binding. Resolution now runs through the same shared routine `fn:in-scope-prefixes` and the `namespace::` axis use, so the three cannot disagree. An absent default namespace remains the empty sequence rather than a zero-length URI, including where an ancestor's default was undeclared with `xmlns=""`. Reported by Martin Honnen (XSpec `x:copy-of-namespaces`), where it accounted for 103 of the 162 XSLT suites.
### Fixes
- **A value comparison (`eq`/`ne`/`lt`/`le`/`gt`/`ge`) with an empty-sequence operand now returns the empty sequence** (XPath 3.1 §3.7.1), instead of falling through to atomization where it could raise a spurious `XPTY0004`. `() lt 5`, `5 eq ()`, etc. now yield `()`. General comparisons (`=`, `<`, …) already returned `false` for an empty operand and are unchanged. Surfaced via XSpec (Martin Honnen): an empty `xs:integer?` variable compared with `lt` against a number.
### 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-xquery/src/…` instead of a local filesystem path). Line numbers are preserved. Release builds only.