XPath/XQuery flatten function

Summary

Replaces any array appearing in a supplied sequence with the members of the array, recursively.

Signature

array:flatten(
$input as item()*
) as item()*

Properties

This function is deterministic, context-independent, and focus-independent.

Rules

The function processes the items in the supplied sequence $input as follows:

  • An item that is an array is replaced by its members, retaining order.

  • Any other item is retained unchanged.

The process is then repeated so long as the sequence contains an array among its items.

The function is equivalent to the following XQuery implementation (assuming static typing is not in force):

				declare function flatten ($S as item()*) {
    for $s in $S return (
      typeswitch($s)
        case $a as array(*) return flatten($a?*)
        default return $s
)}
			

Examples

The expression array:flatten([1, 4, 6, 5, 3]) returns (1, 4, 6, 5, 3).

The expression array:flatten(([1, 2, 5], [[10, 11], 12], [], 13)) returns (1, 2, 5, 10, 11, 12, 13).

The expression array:flatten([(1,0), (1,1), (0,1), (0,0)]) returns (1, 0, 1, 1, 0, 1, 0, 0).

Notes

The argument to the function will often be a single array item, but this is not essential.

Unlike atomization, this function retains any nodes contained in the array.