xquery4 1.6.2

There is a newer version of this package available.
See the version list below for details.
dotnet tool install --global xquery4 --version 1.6.2
                    
This package contains a .NET tool you can call from the shell/command line.
dotnet new tool-manifest
                    
if you are setting up this repo
dotnet tool install --local xquery4 --version 1.6.2
                    
This package contains a .NET tool you can call from the shell/command line.
#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 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. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

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
Loading failed

### 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.