Changes

Jump to navigation Jump to search
7,210 bytes added ,  18:35, 1 December 2023
m
Text replacement - "<syntaxhighlight lang="xquery">" to "<pre lang='xquery'>"
This [[Module Library|XQuery Module]] contains functions for manipulating arrays, which has been introduced with [[XQuery 3.1#Arrays|XQuery 3.1]] and extended with [[XQuery 4.0#Arrays|XQuery 4.0]].
=Conventions=
All functions and errors in this module are assigned to the <code><nowiki>http://www.w3.org/2005/xpath-functions/array</nowiki></code> namespace, which is statically bound to the {{Code|array}} prefix.<br/>
=Functions=
==array:sizeappend==
{| width='100%'
| width='120' | '''SignaturesSignature'''|{{Func|<pre>array:size|append( $array as array(*), $input member as item()*) as array(*)|xs:integer}}</pre>|-valign="top"
| '''Summary'''
| Returns the number a copy of members in {{Code|$array}}. Note that because an array is an item, the with {{Code|fn:count}} function when applied to an array always returns {{Code|1$member}}attached.|-valign="top"
| '''Examples'''
|
* <code>array:sizeappend(array { 1 to 10 }[], 'member1')</code> returns the array {{Code|10}}.* <code>array:size([1 to 10"member1"])</code> returns {{Code|1}}, because the array contains a single sequence with 10 integers.
|}
==array:getbuild==
{| width='100%'
| width='120' | '''SignaturesSignature'''|{{Func|<pre>array:get|build( $array input as arrayitem()*), $position action as function(item()) as xs:integer|item()*}}:= fn:identity#1) as array(*)</pre>|-valign="top"
| '''Summary'''
| Returns the an {{Code|$array}} member at obtained by evaluating the specified {{Code|$position}}. |-| '''Errors'''|{{Error|FOAY0001|#Errors}} supplied function {{Code|$positionaction}} is not once for each item in the range {{Code|1}} to {{Code|array:size($array)input}} inclusivesequence.|-valign="top"
| '''Examples'''
|
* <ul> <li> <code>array:getbuild(1 to 5)</code> returns <code>[1,2,3,4,5]</code> </li> <li> <code>array :build(1 to 5, function { reverse2 * . })</code> returns <code>[2,4,6,8,10]</code> </li> <li> <code>array:build(1 to 5, function { 1 to . })</code> returns <code>[1,(1,2) },(1,2,3),(1,2,3,4),(1,2,3,4, 5)]</code> returns the value </li> <li> <code>array:build(1 to 5, function {array {Code|1to . }}.)</code> returns <code>[[1],[1,2],[1,2,3],[1,2,3,4],[1,2,3,4,5]]</code> </li> <li> <code>array:build(("red", "green", "blue"), characters#1)</code> returns <code>[("r","e","d"),("g","r","e","e","n"),("b","l","u","e")]</code> </li></ul>
|}
==array:appendempty==
{| width='100%'
| width='120' | '''SignaturesSignature'''|{{Func|<pre>array:append|empty( $array as array(*), $member ) as item()*|array(*)}}xs:boolean</pre>|-valign="top"
| '''Summary'''
| Returns a copy of {{Code|$arraytrue}} with a new if the supplied {{Code|$memberarray}} attachedcontains no members.|-valign="top"
| '''Examples'''
|
* <ul> <li> <code>array:empty(["a", "b", "c"])</code> returns <code>false()</code> </li> <li> <code>array:appendempty([], 'member1')</code> returns <code>true()</code> </li> <li> <code>array:empty([[]])</code> returns the <code>false()</code> </li> <li> <code>array {{Code|:empty(["member1"()]}}.)</code> returns <code>false()</code> </li></ul>
|}
==array:subarrayexists==
{| width='100%'
| width='120' | '''SignaturesSignature'''|{{Func|<pre>array:subarray|exists( $array as array(*), $position ) as xs:integer|array(*)}}boolean<br/pre>{{Func|array:subarray|$array as array(*), $position as xs:integer, $length as xs:integer|array(*)}}|-valign="top"
| '''Summary'''
| Constructs a new array with with Returns {{Code|$lengthtrue}} members of {{Code|$array}} beginning from if the specified supplied {{Code|$position}}.<br/>The two-argument version of the function returns the same result as the three-argument version when called with {{Code|$length}} equal to the value of {{Code|array:size($array) - $position + 1}}.|-| '''Errors'''|{{Error|FOAY0001|#Errors}} {{Code|$position}} is less than contains one, or if {{Code|$position + $length}} is greater than {{Code|array:size($array) + 1}}.<br/>{{Error|FOAY0002|#Errors}} {{Code|$length}} is less than zeromore members.|-valign="top"
| '''Examples'''
|
* <ul> <li> <code>array:exists(["a", "b", "c"])</code> returns <code>true()</code> </li> <li> <code>array:exists([])</code> returns <code>false()</code> </li> <li> <code>array:appendexists(['member1'[]], 'member2')</code> returns the <code>true()</code> </li> <li> <code>array {{Code|:exists(["member1", "member2"()]}}.)</code> returns <code>true()</code> </li></ul>
|}
==array:putfilter== {| width='100%'| width='120' | '''Signature'''|<pre>array:filter( $array as array(*), $predicate as function(item()*) as xs:boolean) as array(*)</pre>|- valign="top"| '''Summary'''| Returns a new array with those members of {{Code|$array}} for which {{Code|$predicate}} returns {{Code|true}}.|- valign="top"| '''Examples'''|The following query returns the array {{Code|[0, 1, 3]}}:<pre lang='xquery'>array:filter( array { 0, 1, -2, 3, -4 }, function($i) { $i > 0 })</pre>|} ==array:flatten==
{| width='100%'
| width='120' | '''SignaturesSignature'''|{{Func|<pre>array:put|flatten( $array items as arrayitem()*), $position as xs:integer, $member as item()*|array(*)}}</pre>|-valign="top"
| '''Summary'''
| Returns a copy of {{Code|$array}} with {{Code|$member}} replaced at the specified {{Code|$position}}. Equivalent to <code>$array => array:remove($position) => array:insert-before($position, $member)</code>.|-| '''Errors'''|{{Error|FOAY0001|#Errors}} {{Code|$position}} is not Recursively flattens all arrays that occur in the range supplied {{Code|1}} to {{Code|array:size($array)items}} inclusive.|-valign="top"
| '''Examples'''
|
* <code>array:putflatten(["a", "b"])</code> returns the sequence {{Code|"a", "cb"]}}.* <code>array:flatten([1, [2, "d"3],4]])</code> returns the sequence {{Code|1, 2, 3, 4}}.|} ==array:fold-left== {| width='100%'| width='120' | '''Signature'''|<pre>array:fold-left( $array as array(*), $zero as item()*, $action as function(item()*, item()*) as item()*) as item()*</pre>|- valign="top"| '''Summary'''| Evaluates the supplied {{Code|$action}} cumulatively on successive members of the supplied {{Code|$array }} from left to right, and uses {{Code|[$zero}} as first argument.|- valign="top"| '''Examples'''|The following query returns {{Code|55}} (the sum of the integers 1 to 10):<pre lang='xquery'>array:fold-left( array { 1 to 10 }, 0, function($a, $b) { $a"+ $b })</pre>|} ==array:fold-right== {| width='100%'| width='120' | '''Signature'''|<pre>array:fold-right( $array as array(*), $zero as item()*, $action as function(item()*, item()*) as item()*) as item()*</pre>|- valign="dtop"| '''Summary'''| Evaluates the supplied {{Code|$action}} cumulatively on successive members of the supplied {{Code|$array}} from right to left, and uses {{Code|$zero}} as first argument.|- valign="ctop"]| '''Examples'''|The following query is equivalent to the expression <code>array:reverse(array { 1 to 5 })</code>:<pre lang='xquery'>array { array:fold-right( array { 1 to 5 }, (), function($a, $b) { $b, $a } )}.</pre>
|}
==array:removefoot==
{| width='100%'
| width='120' | '''SignaturesSignature'''|{{Func|<pre>array:remove|foot( $array as array(*), $positions ) as xs:integer*|arrayitem()*)}}</pre>|-valign="top"
| '''Summary'''
| Returns a copy the last member of an array, that is {{Code|$array}} without the member at the specified {{Code|$positions}}.|-| '''Errors'''|{{Error|FOAY0001|#Errors}} A position is not in the range {{Code|1}} to {{Code|(array:size($array))}} inclusive.|-valign="top"
| '''Examples'''
|
* <ul> <li> <code>array:foot([5, 6, 7, 8])</code> returns <code>8</code> </li> <li> <code>array:appendfoot([["a", "b"], ["c", "d"]])</code> returns <code>["c","d"]</code> </li> <li> <code>array:foot([("a", "b"), ("c", 1"d")])</code> returns 2 results <code>"c"</code> and <code>"d"</code> </li></ul>|} ==array:for-each== {| width='100%'| width='120' | '''Signature'''|<pre>array:for-each( $array as array(*), $action as function(item()*) as item()*) as array(*)</pre>|- valign="top"| '''Summary'''| Returns a new array, in which each member is computed by applying {{Code|$action}} to the corresponding member of {{Code|$array}}.|- valign="top"| '''Examples'''|The following query returns the array {{Code|[2, 3, 4, 5, 6]}}: <pre lang='xquery'>array:for-each( array { 1 to 5 }, function($i) { $i + 1})</pre>|} ==array:for-each-pair== {| width='100%'| width='120' | '''Signature'''|<pre>array:for-each-pair( $array1 as array(*), $array2 as array(*), $action as function(item()*) as item()*) as array(*)</pre>|- valign="top"| '''Summary'''| Returns a new array obtained by evaluating the supplied {{Code|$action}} for each pair of members at the same position in {{Code|$array1}} and {{Code|$array2}}.|- valign="top"| '''Examples'''|The following query returns the array {{Code|[5, 7, 9]}}:<pre lang='xquery'>array:for-each-pair( array { 1 to 3 }, array { 4 to 6 }, function($a + $b) { $a + $b })</pre>
|}
==array:insert-beforeget==
{| width='100%'
| width='120' | '''SignaturesSignature'''|{{Func|<pre>array:insert-before|get( $array as array(*), $position as xs:integer, $member ) as item()*|array(*)}}</pre>|-valign="top"
| '''Summary'''
| Returns a copy of the {{Code|$array}} with one new {{Code|$member}} at the specified {{Code|$position}}. Setting {{Code|$position}} to the value {{Code|array:size($array) + 1}} yields the same result as {{Code|array:append($array, $insert)}}.|-valign="top"
| '''Errors'''
|{{Error|FOAY0001|#Errors}} {{Code|$position}} is not in the range {{Code|1}} to {{Code|array:size($array) + 1}} inclusive.|-valign="top"
| '''Examples'''
|
* <code>array:insert-beforeget(array { reverse(["a"], 1to 5) }, "b"5)</code> returns the array value {{Code|["b", "a"]1}}.
|}
{| width='100%'
| width='120' | '''SignaturesSignature'''|{{Func|<pre>array:head|( $array as array(*)|) as item()*}}</pre>|-valign="top"
| '''Summary'''
| Returns the first member of {{Code|$array}}. This function is equivalent to the expression {{Code|$array(1)}}.
|-valign="top"
| '''Errors'''
|{{Error|FOAY0001|#Errors}} The array is empty.
|-valign="top"
| '''Examples'''
|
|}
==array:tailindex-where==
{| width='100%'
| width='120' | '''SignaturesSignature'''|{{Func|<pre>array:tail|index-where( $array as array(*)|array, $predicate as function(item()*, xs:integer)}}as xs:boolean ) as xs:integer*</pre>|-valign="top"
| '''Summary'''
| Returns a new array with all members except the first from position in an input {{Code|$array}}. This function is equivalent to the expression of members that match a supplied {{Code|array:remove($array, 1)}}.|-| '''Errors'''|{{Error|FOAY0001|#Errorspredicate}} The array is empty.|-valign="top"
| '''Examples'''
|
* <ul> <li> <code>array:insertindex-beforewhere(["a"0, (), 4, 9], boolean#1)</code> returns <code>()</code> </li> <li> <code>array:index-where([0, (), 4, 9], "b"boolean#1)</code> returns the <code>(3, 4)</code> </li> <li> <code>array:index-where( array {1 to 10 }, function {Code|. mod 2 = 0 })</code> returns <code>(2, 4, 6, 8, 10)</code> </li> <li> <pre>array:index-where( ["bJanuary", "February", "March", "April", "May", "June", "July", "August", "September", "aOctober", "November", "December"], contains(?, "r"))</pre> returns <code>(1, 2, 3, 4, 9, 10, 11, 12)</code> </li> <li> <pre>array:index-where( [(1, 2, 3), (4, 5, 6), (7, 8)], function($m) { count($m) = 3 })</pre> returns <code>(1, 2)</code> </li> <li> <pre>array:index-where( [ 1, 8, 2, 7, 3 ], fn($member, $pos) { $member < 5 and $pos > 2 }.)</pre> returns <code>(3, 5)</code> </li></ul>
|}
==array:reverseinsert-before==
{| width='100%'
| width='120' | '''SignaturesSignature'''|{{Func|<pre>array:reverse|insert-before( $array as array(*)|, $position as xs:integer, $member as item()* ) as array(*)}}</pre>|-valign="top"
| '''Summary'''
| Returns a new an array with containing all the members of the supplied {{Code|$array}} in reverse order, with one additional {{Code|$member}} at a specified {{Code|$position}}.|-valign="top"
| '''Examples'''
|
* <codeul> <li> <pre>array:reverseinsert-before(array { 1 to ["a", "b", "c", "d"], 3 }, ("x", "y"))</pre> returns <code>["a", "b", ("x", "y"), "c", "d"]</code> </li> <li> <pre>array:insert-before( ["a", "b", "c", "d"], 5, ("x", "y"))</pre> returns the <code>["a", "b", "c", "d", ("x", "y")]</code> </li> <li> <pre>array {{Code|:insert-before( ["a", "b", "c", "d"], 3, 2 ["x", "y"])</pre> returns <code>["a", "b", ["x", "y"], 1"c", "d"]}}.</code> </li></ul>
|}
 
==array:join==
{| width='100%'
| width='120' | '''SignaturesSignature'''|{{Func|<pre>array:join|( $arrays as array(*)*|) as array(*)}}</pre>|-valign="top"
| '''Summary'''
| Concatenates the contents of several {{Code|$arrays}} into a single array.
|-valign="top"
| '''Examples'''
|
* <code>array:join(())</code> returns the array {{Code|[]}}.
* <code>array:join((1 to 3) ! array { . })</code> returns the array {{Code|[1, 2, 3]}}.
* <code>array:join((["a", "b"], ["c", "d"]))</code> returns the array {{Code|["a", "b", "c", "d"]}}.
* <code>array:join((["a", "b"], ["c", "d"], [ ]))</code> returns the array {{Code|["a", "b", "c", "d"]}}.
* <code>array:join((["a", "b"], ["c", "d"], [["e", "f"]]))</code> returns the array {{Code|["a", "b", "c", "d", ["e", "f"]]}}.
|}
 
==array:members==
 
{| width='100%'
| width='120' | '''Signature'''
|<pre>array:members(
$array as array(*)
) as record(value as item()*)*
</pre>
|- valign="top"
| '''Summary'''
| Delivers the contents of an {{Code|$array}} as a sequence of value records.
|- valign="top"
| '''Note'''
| This function is the inverse of [[#array:of-members|array:of-members]].
|- valign="top"
| '''Examples'''
|
<ul>
<li><code>array:members([])</code> returns {{Code|()}}.</li>
<li><code>array:members([1 to 5])?value</code> returns {{Code|(1, 2, 3, 4, 5)}}.</li>
<li><code>array:members([(1,1), (2,4), (3,9), (4,16), (5,25)]) ! sum(?value)</code> returns {{Code|(2, 6, 12, 20, 30)}}.</li>
<li><pre>let $array := [ "any array" ]
return deep-equal(
$array,
array:of-members(array:members($array))
)</pre> returns {{Code|true()}}</li>
</ul>
|}
 
==array:of-members==
 
{| width='100%'
| width='120' | '''Signature'''
|<pre>array:of-members(
$input as record(value as item()*)*
) as array(*)
</pre>
|- valign="top"
| '''Summary'''
| Constructs an array from the contents of an {{Code|$input}} sequence of value records.
|- valign="top"
| '''Note'''
| This function is the inverse of [[#array:members|array:members]].
|- valign="top"
| '''Examples'''
|
<ul>
<li><code>array:of-members(())</code> returns {{Code|[]}}.</li>
<li><code>array:of-members(map { 'value': (1 to 5) })</code> returns {{Code|[(1, 2, 3, 4, 5)]}}.</li>
<li><code>array:of-members((1 to 5) ! map { 'value': . })</code> returns {{Code|[1, 2, 3, 4, 5]}}.</li>
<li><code>array:of-members((1 to 5) ! map { 'value': (., .*.) })</code> returns {{Code|[(1, 1), (2, 4), (3, 9), (4, 16), (5, 25)]}}.</li>
</ul>
|}
==array:flattenput==
{| width='100%'
| width='120' | '''SignaturesSignature'''|{{Func|<pre>array:put( $array as array(*), $position as xs:flatten|integer, $items member as item()*|item) as array(*)*}}</pre>|-valign="top"
| '''Summary'''
| Recursively flattens all arrays that occur Returns a copy of {{Code|$array}} with {{Code|$member}} replaced at the specified {{Code|$position}}. Equivalent to <code>$array => array:remove($position) => array:insert-before($position, $member)</code>.|- valign="top"| '''Errors'''|{{Error|FOAY0001|#Errors}} {{Code|$position}} is not in the supplied range {{Code|1}} to {{Code|array:size($itemsarray)}}inclusive.|-valign="top"
| '''Examples'''
|
* <code>array:flattenput(["a","b", "c"], 2, "d")</code> returns the sequence array {{Code|["a", "bd"}}.* <code>array:flatten([1,[2,3],4]"c"])</code> returns the sequence {{Code|1, 2, 3, 4}}.
|}
==array:for-eachremove==
{| width='100%'
| width='120' | '''SignaturesSignature'''|{{Func|<pre>array:for-each|remove( $array as array(*), $function positions as function(item()xs:integer*) as item()*|array(*)}}</pre>|-valign="top"
| '''Summary'''
| Returns a new copy of {{Code|$array, in which each }} without the member at the specified {{Code|$positions}}.|- valign="top"| '''Errors'''|{{Error|FOAY0001|#Errors}} A position is computed by applying not in the range {{Code|$function1}} to the corresponding member of {{Code|array:size($array)}}inclusive.|-valign="top"
| '''Examples'''
|The following query returns the array {{Code|[2, 3, 4, 5, 6]}}:* <pre class="brush:xquery"code>array:for-eachappend( array { 1 to 5 }["a"], function($i) { $i + 1})</precode>returns the array {{Code|[]}}.
|}
==array:filtersize==
{| width='100%'
| width='120' | '''SignaturesSignature'''|{{Func|<pre>array:filter|size( $array as array(*), $function as function(item()*) as xs:boolean|array(*)}}integer</pre>|-valign="top"
| '''Summary'''
| Returns a new array with those the number of members of in {{Code|$array}} for which . Note that because an array is an item, the {{Code|$functionfn:count}} function when applied to an array always returns {{Code|true1}}.|-valign="top"
| '''Examples'''
|The following query * <code>array:size(array { 1 to 10 })</code> returns the array {{Code|[0, 1, 3]10}}:.* <pre class="brush:xquery"code>array:filtersize( array { 0, [1, -2, 3, -4 }, function($ito 10]) { $i > 0 })</precode>returns {{Code|1}}, because the array contains a single sequence with 10 integers.
|}
==array:fold-leftsubarray==
{| width='100%'
| width='120' | '''SignaturesSignature'''|{{Func|<pre>array:fold-left|subarray( $array as array(*), $zero position as item()*xs:integer, $function length as function(itemxs:integer := ()*, item()*) as itemarray()*|item()*}}</pre>|-valign="top"
| '''Summary'''
| Evaluates the supplied Constructs a new array with with {{Code|$functionlength}} cumulatively on successive members of the supplied {{Code|$array}} beginning from left to right and using the specified {{Code|$zeroposition}} .<br/>The two-argument version of the function returns the same result as first the three-argumentversion when called with {{Code|$length}} equal to the value of {{Code|array:size($array) - $position + 1}}.|- valign="top"| '''Errors'''|{{Error|FOAY0001|#Errors}} {{Code|$position}} is less than one, or if {{Code|$position + $length}} is greater than {{Code|array:size($array) + 1}}.<br/>{{Error|FOAY0002|#Errors}} {{Code|$length}} is less than zero.|-valign="top"
| '''Examples'''
|The following query returns {{Code|55}} (the sum of the integers 1 to 10):* <pre class="brush:xquery"code>array:fold-leftsubarray( array { 1 to 10 }["a", 0"b", function($a"c"], $b2) </code> returns the array { $a + ${Code|["b ", "c"]})</pre>}.
|}
==array:fold-righttail==
{| width='100%'
| width='120' | '''SignaturesSignature'''|{{Func|<pre>array:fold-right|tail( $array as array(*), $zero as item()*, $function as functionarray(item()*, item()*) as item()*|item()*}}</pre>|-valign="top"
| '''Summary'''
| Evaluates Returns a new array with all members except the supplied first from {{Code|$functionarray}} cumulatively on successive members of . This function is equivalent to the supplied expression {{Code|array:remove($array, 1)}} from right to left and using .|- valign="top"| '''Errors'''|{{CodeError|FOAY0001|$zero#Errors}} as first argumentThe array is empty.|-valign="top"
| '''Examples'''
|The following query is equivalent to the expression * <code>array:reverseinsert-before(array { ["a"], 1 to 5 }, "b")</code>:<pre class="brush:xquery">returns the array { array:fold-right( array { 1 to 5 }, (), function($a, $b) { $Code|["b", $"a "]} )}</pre>.
|}
==array:for-each-pairreverse==
{| width='100%'
| width='120' | '''SignaturesSignature'''|{{Func|<pre>array:for-each-pair|reverse( $array1 as array(*), $array2 as array(*), $function as function(item()*) as item()*|array(*)}}</pre>|-valign="top"
| '''Summary'''
| Returns a new array obtained by evaluating the supplied with all members of {{Code|$functionarray}} for each pair of members at the same position in {{Code|$array1}} and {{Code|$array2}}reverse order.|-valign="top"
| '''Examples'''
|The following query returns the array {{Code|[5, 7, 9]}}:* <pre class="brush:xquery"code>array:for-each-pairreverse( array { 1 to 3 }, )</code> returns the array { 4 to 6 {Code|[3, 2, 1]}, function($a + $b) { $a + $b })</pre>.
|}
==array:sort==
 
{{Mark|Updated with Version 8.6}}: Collation argument was inserted between first and second argument.
{| width='100%'
| width='120' | '''SignaturesSignature'''|{{Func|array:sort|$array as array(*)|array(*)}}<br/pre>{{Func|array:sort|( $array as array(*), $collation as xs:string?) as xs:anyAtomicType*|array(*)}}<br/>{{Func|array :sort|$array as array= (*), $collation as xs:string?, $key as function(item()*) as xs:anyAtomicType*|:= ()) as array(*)}}<br/pre>|-valign="top"
| '''Summary'''
| Returns a new array with sorted {{Code|$array}} members, using an optional {{Code|$collation}}. If a {{Code|$key}} function is supplied, it will be applied on all array members. The items of the resulting values will be sorted using the semantics of the {{Code|lt}} expression.
|-valign="top"
| '''Examples'''
|
* <code>array:sort(array { reverse(1 to 3) })</code> returns <code>[1, 2, 3]</code>
* <code>array:sort([3, -2, 1], (), abs#1)</code> returns <code>[1, -2, 3]</code>
* <code>array:sort([1,2,3], (), function($x) { -$x })</code> returns <code>[3, 2, 1]</code>
* <code>array:sort((1, 'a'))</code> returns an error (strings and integers cannot be compared)
|}
! width="110"|Code
|Description
|-valign="top"
|{{Code|FOAY0001}}
|The specified index extends beyonds the bounds of an array.
|-valign="top"
|{{Code|FOAY0002}}
|The specified length is less than zero.
|}
 
=Changelog=
 
;Version 11.0
 
* Added: {{Function||array:build}}
* Added: {{Function||array:foot}}
* Added: {{Function||array:members}}
* Added: {{Function||array:of-members}}
;Version 8.6
* Updated: Collation {{Function||array:put}} collation argument was inserted between first and second argument.
;Version 8.5
* Added: [[#array:put{{Function||array:put]]}}
;Version 8.4
Bureaucrats, editor, reviewer, Administrators
13,554

edits

Navigation menu