Difference between revisions of "Map Module"

From BaseX Documentation
Jump to navigation Jump to search
Line 5: Line 5:
 
The function call <code>[[#get|map:get($map, $key)]]</code> can be used to retrieve the value associated with a given key.
 
The function call <code>[[#get|map:get($map, $key)]]</code> can be used to retrieve the value associated with a given key.
  
A <em>map</em> can also be viewed as a function from keys to associated values. To achieve this, a map is also a function item. The function corresponding to the map has the signature <code>function($key as xs:anyAtomicType) as item()*</code>. Calling the function has the same effect as calling the <code>get</code> function: the expression <code>$map($key)</code> returns the same result as <code>map:get($map, $key)</code>. For example, if <code>$books-by-isbn</code> is a map whose keys are ISBNs and whose assocated values are <code>book</code> elements, then the expression <code>$books-by-isbn("0470192747")</code> returns the <code>book</code> element with the given ISBN. The fact that a map is a function item allows it to be passed as an argument to higher-order functions that expect a function item as one of their arguments. As an example, the following query uses the higher-order function <code>fn:map($f, $seq)</code> to extract all bound values from a <em>map</em>:
+
A ''map'' can also be viewed as a function from keys to associated values. To achieve this, a map is also a function item. The function corresponding to the map has the signature <code>function($key as xs:anyAtomicType) as item()*</code>. Calling the function has the same effect as calling the <code>get</code> function: the expression <code>$map($key)</code> returns the same result as <code>map:get($map, $key)</code>. For example, if <code>$books-by-isbn</code> is a map whose keys are ISBNs and whose assocated values are <code>book</code> elements, then the expression <code>$books-by-isbn("0470192747")</code> returns the <code>book</code> element with the given ISBN. The fact that a map is a function item allows it to be passed as an argument to higher-order functions that expect a function item as one of their arguments. As an example, the following query uses the higher-order function <code>fn:map($f, $seq)</code> to extract all bound values from a ''map'':
  
 
<pre class="brush:xquery">
 
<pre class="brush:xquery">
Line 14: Line 14:
 
This returns some permutation of <code>(42, 'baz', 456)</code>.
 
This returns some permutation of <code>(42, 'baz', 456)</code>.
  
Like all other values, <em>maps</em> are immutable. For example, the <code>map:remove</code> function creates a new map by removing an entry from an existing map, but the existing map is not changed by the operation.
+
Like all other values, ''maps'' are immutable. For example, the <code>map:remove</code> function creates a new map by removing an entry from an existing map, but the existing map is not changed by the operation.
  
Like sequences, <em>maps</em> have no identity. It is meaningful to compare the contents of two maps, but there is no way of asking whether they are "the same map": two maps with the same content are indistinguishable.
+
Like sequences, ''maps'' have no identity. It is meaningful to compare the contents of two maps, but there is no way of asking whether they are "the same map": two maps with the same content are indistinguishable.
  
 
Because a map is a function item, functions that apply to functions also apply to maps. A map is an anonymous function, so <code>fn:function-name</code> returns the empty sequence; <code>fn:function-arity</code> always returns <code>1</code>.
 
Because a map is a function item, functions that apply to functions also apply to maps. A map is an anonymous function, so <code>fn:function-name</code> returns the empty sequence; <code>fn:function-arity</code> always returns <code>1</code>.
Line 30: Line 30:
 
   return concat($m, ':=', $map($m)), ', '
 
   return concat($m, ':=', $map($m)), ', '
 
)
 
)
 +
</pre>
 +
 +
Some examples use the ''map'' <code>$week</code> defined as:
 +
<pre class="brush:xquery">
 +
declare variable $week as map(*) := map {
 +
  0:="Sonntag",
 +
  1:="Montag",
 +
  2:="Dienstag",
 +
  3:="Mittwoch",
 +
  4:="Donnerstag",
 +
  5:="Freitag",
 +
  6:="Samstag"
 +
};
 +
 
</pre>
 
</pre>
  
Line 35: Line 49:
 
{|
 
{|
 
| width='90' valign='top' | '''Signatures'''
 
| width='90' valign='top' | '''Signatures'''
| <code><strong>map:collation</strong>($map as map(*)) as xs:string</code><br/>
+
|
 +
* <code><strong>map:collation</strong>($map as map(*)) as xs:string</code>
 
|-
 
|-
 
| valign='top' | '''Summary'''
 
| valign='top' | '''Summary'''
| Returns the collation URI of the <em>map</em> supplied as <code>$map</code>.
+
| Returns the collation URI of the ''map'' supplied as <code>$map</code>.
 
|}
 
|}
  
Line 44: Line 59:
 
{|
 
{|
 
| width='90' valign='top' | '''Signatures'''
 
| width='90' valign='top' | '''Signatures'''
| <code><strong>map:contains</strong>($map as map(*), $key as item()) as xs:boolean</code><br/>
+
|
 +
* <code><strong>map:contains</strong>($map as map(*), $key as item()) as xs:boolean</code>
 
|-
 
|-
 
| valign='top' | '''Summary'''
 
| valign='top' | '''Summary'''
| Returns true if the <em>map</em> supplied as <code>$map</code> contains an entry with a key equal to the supplied value of <code>$key</code>; otherwise it returns false. The equality comparison uses the map's collation; no error occurs if the map contains keys that are not comparable with the supplied <code>$key</code>.
+
| Returns true if the ''map'' supplied as <code>$map</code> contains an entry with a key equal to the supplied value of <code>$key</code>; otherwise it returns false. The equality comparison uses the map's collation; no error occurs if the map contains keys that are not comparable with the supplied <code>$key</code>.
 
If the supplied key is <code>xs:untypedAtomic</code>, it is converted to <code>xs:string</code>. If the supplied key is the <code>xs:float</code> or <code>xs:double</code> value <code>NaN</code>, the function returns false.
 
If the supplied key is <code>xs:untypedAtomic</code>, it is converted to <code>xs:string</code>. If the supplied key is the <code>xs:float</code> or <code>xs:double</code> value <code>NaN</code>, the function returns false.
<pre class="brush:xquery">let $week := map{ 0:="Sonntag", 1:="Montag", 2:="Dienstag", 3:="Mittwoch",
 
                4:="Donnerstag", 5:="Freitag", 6:="Samstag" }</pre>
 
 
|-
 
|-
 
| valign='top' | '''Examples'''
 
| valign='top' | '''Examples'''
|<code>map:contains($week, 2)</code> returns <code>true()</code>.<br/>– <code>map:contains($week, 9)</code> returns <code>false()</code>.<br/>– <code>map:contains(map{}, "xyz")</code> returns <code>false()</code>.<br/>– <code>map:contains(map{ "xyz":=23 }, "xyz")</code> returns <code>true()</code>.<br/>
+
|  
 +
* <code>map:contains($week, 2)</code> returns <code>true()</code>.
 +
* <code>map:contains($week, 9)</code> returns <code>false()</code>.
 +
* <code>map:contains(map{}, "xyz")</code> returns <code>false()</code>.
 +
* <code>map:contains(map{ "xyz":=23 }, "xyz")</code> returns <code>true()</code>.
 
|}
 
|}
  
Line 59: Line 77:
 
{|
 
{|
 
| width='90' valign='top' | '''Signatures'''
 
| width='90' valign='top' | '''Signatures'''
| <code><strong>map:entry</strong>($key as item(), $value as item()*) as map(*)</code><br/>
+
|
 +
* <code><strong>map:entry</strong>($key as item(), $value as item()*) as map(*)</code>
 
|-
 
|-
 
| valign='top' | '''Summary'''
 
| valign='top' | '''Summary'''
| Creates a new <em>map</em> containing a single entry. The collation of the new map is the default collation from the static context. The key of the entry in the new map is <code>$key</code>, and its associated value is <code>$value</code>. If the supplied key is <code>xs:untypedAtomic</code>, it is converted to <code>xs:string</code>. If the supplied key is the <code>xs:float</code> or <code>xs:double</code> value <code>NaN</code>, the supplied <code>$map</code> is returned unchanged.
+
| Creates a new ''map'' containing a single entry. The collation of the new map is the default collation from the static context. The key of the entry in the new map is <code>$key</code>, and its associated value is <code>$value</code>. If the supplied key is <code>xs:untypedAtomic</code>, it is converted to <code>xs:string</code>. If the supplied key is the <code>xs:float</code> or <code>xs:double</code> value <code>NaN</code>, the supplied <code>$map</code> is returned unchanged.
 
The function <code>map:entry</code> is intended primarily for use in conjunction with the function <code>[[#map:new|map:new]]</code>. For example, a map containing seven entries may be constructed like this:
 
The function <code>map:entry</code> is intended primarily for use in conjunction with the function <code>[[#map:new|map:new]]</code>. For example, a map containing seven entries may be constructed like this:
  
Line 81: Line 100:
 
|-
 
|-
 
| valign='top' | '''Examples'''
 
| valign='top' | '''Examples'''
|<code>map:entry("M", "Monday")</code> creates a map with the values <code>{ "M":="Monday" }</code>.
+
|
 +
* <code>map:entry("M", "Monday")</code> creates a map with the values <code>{ "M":="Monday" }</code>.
 
|}
 
|}
  
Line 87: Line 107:
 
{|
 
{|
 
| width='90' valign='top' | '''Signatures'''
 
| width='90' valign='top' | '''Signatures'''
| <code><strong>map:get</strong>($map as map(*), $key as item()) as item()*</code><br/>
+
|
 +
* <code><strong>map:get</strong>($map as map(*), $key as item()) as item()*</code>
 
|-
 
|-
 
| valign='top' | '''Summary'''
 
| valign='top' | '''Summary'''
|Returns the value associated with a supplied key in a given map. This function attempts to find an entry within the <em>map</em> supplied as <code>$map</code> that has a key equal to the supplied value of <code>$key</code>. If there is such  an entry, it returns the associated value; otherwise it returns an empty sequence. The equality comparison uses the map's collation; no error occurs if the map contains keys that are not comparable with the supplied <code>$key</code>. If the supplied key is <code>xs:untypedAtomic</code>, it is converted to <code>xs:string</code>. If the supplied key is the <code>xs:float</code> or <code>xs:double</code> value <code>NaN</code>, the function returns an empty sequence.
+
|Returns the value associated with a supplied key in a given map. This function attempts to find an entry within the ''map'' supplied as <code>$map</code> that has a key equal to the supplied value of <code>$key</code>. If there is such  an entry, it returns the associated value; otherwise it returns an empty sequence. The equality comparison uses the map's collation; no error occurs if the map contains keys that are not comparable with the supplied <code>$key</code>. If the supplied key is <code>xs:untypedAtomic</code>, it is converted to <code>xs:string</code>. If the supplied key is the <code>xs:float</code> or <code>xs:double</code> value <code>NaN</code>, the function returns an empty sequence.
 
A return value of <code>()</code> from <code>map:get</code> could indicate that the key is present in the map with an associated value of <code>()</code>, or it could indicate that the key is not present in the map. The two cases can be distinguished by calling <code>map:contains</code>.
 
A return value of <code>()</code> from <code>map:get</code> could indicate that the key is present in the map with an associated value of <code>()</code>, or it could indicate that the key is not present in the map. The two cases can be distinguished by calling <code>map:contains</code>.
Invoking the <em>map</em> as a function item has the same effect as calling <code>get</code>: that is, when <code>$map</code> is a map, the expression <code>$map($K)</code> is equivalent to <code>get($map, $K)</code>. Similarly, the expression <code>get(get(get($map, 'employee'), 'name'), 'first')</code> can be written as <code>$map('employee')('name')('first')</code>.
+
Invoking the ''map'' as a function item has the same effect as calling <code>get</code>: that is, when <code>$map</code> is a map, the expression <code>$map($K)</code> is equivalent to <code>get($map, $K)</code>. Similarly, the expression <code>get(get(get($map, 'employee'), 'name'), 'first')</code> can be written as <code>$map('employee')('name')('first')</code>.
 
|-
 
|-
 
| valign='top' | '''Examples'''
 
| valign='top' | '''Examples'''
|<code>map:get($week, 4)</code> returns <code>"Donnerstag"</code>.<br/>– <code>map:get($week, 9)</code> returns <code>()</code>. <em>(When the key is not present, the function returns an empty sequence.).</em><br/>– <code>map:get(map:entry(7,())), 7)</code> returns <code>()</code>. <em>(An empty sequence as the result can also signify that the key is present and the associated value is an empty sequence.).</em><br/>
+
|
 +
* <code>map:get($week, 4)</code> returns <code>"Donnerstag"</code>.
 +
* <code>map:get($week, 9)</code> returns <code>()</code>. ''(When the key is not present, the function returns an empty sequence.).''
 +
* <code>map:get(map:entry(7,())), 7)</code> returns <code>()</code>. ''(An empty sequence as the result can also signify that the key is present and the associated value is an empty sequence.).''
 
|}
 
|}
  
Line 101: Line 125:
 
{|
 
{|
 
| width='90' valign='top' | '''Signatures'''
 
| width='90' valign='top' | '''Signatures'''
| <code><strong>map:keys</strong>($map as map(*)) as xs:anyAtomicType*</code><br/>
+
|
 +
* <code><strong>map:keys</strong>($map as map(*)) as xs:anyAtomicType*</code>
 
|-
 
|-
 
| valign='top' | '''Summary'''
 
| valign='top' | '''Summary'''
|Returns a sequence containing all the key values present in a map. The function takes any <em>map</em> as its <code>$map</code> argument and returns the keys that are present in the map as a sequence of atomic values, in implementation-dependent order.
+
|Returns a sequence containing all the key values present in a map. The function takes any ''map'' as its <code>$map</code> argument and returns the keys that are present in the map as a sequence of atomic values, in implementation-dependent order.
 
|-
 
|-
 
| valign='top' | '''Examples'''
 
| valign='top' | '''Examples'''
|<code>map:keys(map{ 1:="yes", 2:="no" })</code> returns some permutation of <code>(1,2)</code> <em>(the result is in implementation-dependent order).</em><br/>
+
|
 +
* <code>map:keys(map{ 1:="yes", 2:="no" })</code> returns some permutation of <code>(1,2)</code> ''(the result is in implementation-dependent order).''
 
|}
 
|}
  
Line 113: Line 139:
 
{|
 
{|
 
| width='90' valign='top' | '''Signatures'''
 
| width='90' valign='top' | '''Signatures'''
| <code><strong>map:new</strong>() as map(*)</code><br/><code><strong>map:new</strong>($maps as map(*)*) as map(*)</code><br/><code><strong>map:new</strong>($maps as map(*)*, $coll as xs:string) as map(*)</code><br/>
+
|
 +
* <code><strong>map:new</strong>() as map(*)</code>
 +
* <code><strong>map:new</strong>($maps as map(*)*) as map(*)</code>
 +
* <code><strong>map:new</strong>($maps as map(*)*, $coll as xs:string) as map(*)</code>
 
|-
 
|-
 
| valign='top' | '''Summary'''
 
| valign='top' | '''Summary'''
| Constructs and returns a new map. The zero-argument form of the function returns an empty <em>map</em> whose collation is the default collation in the static context. It is equivalent to calling the one-argument form of the function with an empty sequence as the value of the first argument.
+
| Constructs and returns a new map. The zero-argument form of the function returns an empty ''map'' whose collation is the default collation in the static context. It is equivalent to calling the one-argument form of the function with an empty sequence as the value of the first argument.
The one-argument form of the function returns a <em>map</em> that is formed by combining the contents of the maps supplied in the <code>$maps</code> argument. It is equivalent to calling the two-argument form of the function with the default collation from the static context as the second argument.
+
The one-argument form of the function returns a ''map'' that is formed by combining the contents of the maps supplied in the <code>$maps</code> argument. It is equivalent to calling the two-argument form of the function with the default collation from the static context as the second argument.
The two-argument form of the function returns a <em>map</em> that is formed by combining the contents of the maps supplied in the <code>$maps</code> argument. The collation of the new map is the value of the <code>$collation</code> argument. The supplied maps are combined as follows:
+
The two-argument form of the function returns a ''map'' that is formed by combining the contents of the maps supplied in the <code>$maps</code> argument. The collation of the new map is the value of the <code>$collation</code> argument. The supplied maps are combined as follows:
<ol>
+
 
  <li>
+
# There is one entry in the new map for each distinct key value present in the union of the input maps, where keys are considered distinct according to the rules of the <code>distinct-values</code> function with <code>$collation</code> as the collation.
    <p>
+
# The associated value for each such key is taken from the last map in the input sequence <code>$maps</code> that contains an entry with this key. If this map contains more than one entry with this key (which can happen if its collation is different from that of the new map) then it is ''implementation-dependent'' which of them is selected.
      There is one entry in the new map for each distinct key value
+
 
      present in the union of the input maps, where keys are considered
 
      distinct according to the rules of the <code>distinct-values</code>
 
      function with <code>$collation</code> as the collation.
 
    </p>
 
  </li>
 
  <li>
 
    <p>
 
      The associated value for each such key is taken from the last
 
      map in the input sequence <code>$maps</code> that contains an
 
      entry with this key. If this map contains more than one entry with
 
      this key (which can happen if its collation is different from that
 
      of the new map) then it is <em>implementation-dependent</em>
 
      which of them is selected.
 
    </p>
 
  </li>
 
</ol>
 
 
There is no requirement that the supplied input maps should have the same or compatible types. The type of a map (for example <code>map(xs:integer, xs:string)</code>) is descriptive of the entries it currently contains, but is not a constraint on how the map may be combined with other maps.
 
There is no requirement that the supplied input maps should have the same or compatible types. The type of a map (for example <code>map(xs:integer, xs:string)</code>) is descriptive of the entries it currently contains, but is not a constraint on how the map may be combined with other maps.
<pre class="brush:xquery">let $week := map{ 0:="Sonntag", 1:="Montag", 2:="Dienstag",
 
            3:="Mittwoch", 4:="Donnerstag", 5:="Freitag", 6:="Samstag" }</pre>
 
 
|-
 
|-
 
| valign='top' | '''Examples'''
 
| valign='top' | '''Examples'''
|<code>map:new()</code> creates an empty map.<br/>– <code>map:new(())</code> creates an empty map.<br/>– <code>map:new(map:entry(0, "no"), map:entry(1, "yes"))</code> creates a map with the values <code>{ 0:="no", 1:="yes" }</code>.<br/>– <code>map:new(map:entry(0, "no"), map:entry(1, "yes"))</code> creates a map with the values <code>{ 0:="no", 1:="yes" }</code>.<br/>– <code>map:new(($week, map{ 7:="Unbekannt" }))</code> creates a map with the values <code>{ 0:="Sonntag", 1:="Montag", 2:="Dienstag", 3:="Mittwoch", 4:="Donnerstag", 5:="Freitag", 6:="Samstag", 7:="Unbekannt" }</code>.<br/>– <code>map:new(($week, map{ 6:="Sonnabend" }))</code> creates a map with the values  <code>{ 0:="Sonntag", 1:="Montag", 2:="Dienstag", 3:="Mittwoch", 4:="Donnerstag", 5:="Freitag", 6:="Sonnabend" }</code>.<br/>
+
|
 +
* <code>map:new()</code> creates an empty map.
 +
* <code>map:new(())</code> creates an empty map.
 +
* <code>map:new(map:entry(0, "no"), map:entry(1, "yes"))</code> creates a map with the values <code>{ 0:="no", 1:="yes" }</code>.
 +
* <code>map:new(map:entry(0, "no"), map:entry(1, "yes"))</code> creates a map with the values <code>{ 0:="no", 1:="yes" }</code>.
 +
* <code>map:new(($week, map{ 7:="Unbekannt" }))</code> creates a map with the values <code>{ 0:="Sonntag", 1:="Montag", 2:="Dienstag", 3:="Mittwoch", 4:="Donnerstag", 5:="Freitag", 6:="Samstag", 7:="Unbekannt" }</code>.
 +
* <code>map:new(($week, map{ 6:="Sonnabend" }))</code> creates a map with the values  <code>{ 0:="Sonntag", 1:="Montag", 2:="Dienstag", 3:="Mittwoch", 4:="Donnerstag", 5:="Freitag", 6:="Sonnabend" }</code>.
 
|}
 
|}
  
Line 150: Line 167:
 
{|
 
{|
 
| width='90' valign='top' | '''Signatures'''
 
| width='90' valign='top' | '''Signatures'''
| <code><strong>map:remove</strong>($map as map(*), $key as item()) as map(*)</code><br/>
+
|
 +
* <code><strong>map:remove</strong>($map as map(*), $key as item()) as map(*)</code><br/>
 
|-
 
|-
 
| valign='top' | '''Summary'''
 
| valign='top' | '''Summary'''
 
| Constructs a new map by removing an entry from an existing map. The collation of the new map is the same as the collation of the map supplied as <code>$map</code>. The entries in the new map correspond to the entries of <code>$map</code>, excluding any entry whose key is equal to <code>$key</code>.
 
| Constructs a new map by removing an entry from an existing map. The collation of the new map is the same as the collation of the map supplied as <code>$map</code>. The entries in the new map correspond to the entries of <code>$map</code>, excluding any entry whose key is equal to <code>$key</code>.
 
No failure occurs if the input map contains no entry with the supplied key; the input map is returned unchanged
 
No failure occurs if the input map contains no entry with the supplied key; the input map is returned unchanged
<pre class="brush:xquery">let $week := map{ 0:="Sonntag", 1:="Montag", 2:="Dienstag",
 
            3:="Mittwoch", 4:="Donnerstag", 5:="Freitag", 6:="Samstag" }</pre>
 
 
|-
 
|-
 
| valign='top' | '''Examples'''
 
| valign='top' | '''Examples'''
|<code>map:remove($week, 4)</code> creates a map with the values <code>{ 0:="Sonntag", 1:="Montag", 2:="Dienstag", 3:="Mittwoch", 5:="Freitag", 6:="Samstag" }</code>.<br/>– <code>map:remove($week, 23)</code> creates a map with the values <code>{ 0:="Sonntag", 1:="Montag", 2:="Dienstag", 3:="Mittwoch", 4:="Donnerstag", 5:="Freitag", 6:="Samstag" }</code>.<br/>
+
|
 +
* <code>map:remove($week, 4)</code> creates a map with the values <code>{ 0:="Sonntag", 1:="Montag", 2:="Dienstag", 3:="Mittwoch", 5:="Freitag", 6:="Samstag" }</code>.
 +
* <code>map:remove($week, 23)</code> creates a map with the values <code>{ 0:="Sonntag", 1:="Montag", 2:="Dienstag", 3:="Mittwoch", 4:="Donnerstag", 5:="Freitag", 6:="Samstag" }</code>.
 
|}
 
|}
  
Line 165: Line 183:
 
{|
 
{|
 
| width='90' valign='top' | '''Signatures'''
 
| width='90' valign='top' | '''Signatures'''
| <code><strong>map:size</strong>($map as map(*)) as xs:integer</code><br/>
+
|
 +
* <code><strong>map:size</strong>($map as map(*)) as xs:integer</code><br/>
 
|-
 
|-
 
| valign='top' | '''Summary'''
 
| valign='top' | '''Summary'''
| Returns a the number of entries in the supplied map. The function takes any <em>map</em> as its <code>$map</code> argument and returns the number of entries that are present in the map.
+
| Returns a the number of entries in the supplied map. The function takes any ''map'' as its <code>$map</code> argument and returns the number of entries that are present in the map.
 
|-
 
|-
 
| valign='top' | '''Examples'''
 
| valign='top' | '''Examples'''
|<code>map:size(map:new())</code> returns <code>0</code>.<br/>– <code>map:size(map{ "true":=1, "false":=0 })</code> returns <code>2</code>.<br/>
+
|
 +
* <code>map:size(map:new())</code> returns <code>0</code>.
 +
* <code>map:size(map{ "true":=1, "false":=0 })</code> returns <code>2</code>.
 
|}
 
|}

Revision as of 13:34, 23 April 2011

This module contains XQuery Functions for manipulating maps. All functions are preceded by the map: prefix, which is linked to the http://www.w3.org/2005/xpath-functions/map namespace. The following documentation is derived from a temporary XQuery 3.0 Functions and Operators working draft.

A map is an additional kind of item. It comprises a collation and a set of entries. Each entry comprises a key which is an arbitrary atomic value, and an arbitrary sequence called the associated value. Within a map, no two entries have the same key, when compared using the eq operator under the map's collation. It is not necessary that all the keys should be mutually comparable (for example, they can include a mixture of integers and strings). Key values will never be of type xs:untypedAtomic, and they will never be the xs:float or xs:double value NaN.

The function call map:get($map, $key) can be used to retrieve the value associated with a given key.

A map can also be viewed as a function from keys to associated values. To achieve this, a map is also a function item. The function corresponding to the map has the signature function($key as xs:anyAtomicType) as item()*. Calling the function has the same effect as calling the get function: the expression $map($key) returns the same result as map:get($map, $key). For example, if $books-by-isbn is a map whose keys are ISBNs and whose assocated values are book elements, then the expression $books-by-isbn("0470192747") returns the book element with the given ISBN. The fact that a map is a function item allows it to be passed as an argument to higher-order functions that expect a function item as one of their arguments. As an example, the following query uses the higher-order function fn:map($f, $seq) to extract all bound values from a map:

let $map := map { 'foo' := 42, 'bar' := 'baz', 123 := 456 }
return fn:map($map, map:keys($map))

This returns some permutation of (42, 'baz', 456).

Like all other values, maps are immutable. For example, the map:remove function creates a new map by removing an entry from an existing map, but the existing map is not changed by the operation.

Like sequences, maps have no identity. It is meaningful to compare the contents of two maps, but there is no way of asking whether they are "the same map": two maps with the same content are indistinguishable.

Because a map is a function item, functions that apply to functions also apply to maps. A map is an anonymous function, so fn:function-name returns the empty sequence; fn:function-arity always returns 1.

Maps may be compared using the fn:deep-equal function. The semantics for this function are extended so that when two items are compared, at any level of recursion, the items compare equal if they are both maps, if both use the same collation, if both contain the same set of keys (compared using the eq operator), without regard to ordering, and if for each key that is present in both maps, the associated values are deep-equal. When comparing maps, the maps' collation is used rather than the collation supplied as an argument to the fn:deep-equal function.

There is no operation to atomize a map or convert it to a string. The following XQuery snippet shows how the contents of a map can be serialized:

let $map := map { 1:='a', 2:='b' }
return string-join(
  for $m in map:keys($map)
  return concat($m, ':=', $map($m)), ', '
)

Some examples use the map $week defined as:

declare variable $week as map(*) := map {
  0:="Sonntag",
  1:="Montag",
  2:="Dienstag",
  3:="Mittwoch",
  4:="Donnerstag",
  5:="Freitag",
  6:="Samstag"
};

map:collation

Signatures
  • map:collation($map as map(*)) as xs:string
Summary Returns the collation URI of the map supplied as $map.

map:contains

Signatures
  • map:contains($map as map(*), $key as item()) as xs:boolean
Summary Returns true if the map supplied as $map contains an entry with a key equal to the supplied value of $key; otherwise it returns false. The equality comparison uses the map's collation; no error occurs if the map contains keys that are not comparable with the supplied $key.

If the supplied key is xs:untypedAtomic, it is converted to xs:string. If the supplied key is the xs:float or xs:double value NaN, the function returns false.

Examples
  • map:contains($week, 2) returns true().
  • map:contains($week, 9) returns false().
  • map:contains(map{}, "xyz") returns false().
  • map:contains(map{ "xyz":=23 }, "xyz") returns true().

map:entry

Signatures
  • map:entry($key as item(), $value as item()*) as map(*)
Summary Creates a new map containing a single entry. The collation of the new map is the default collation from the static context. The key of the entry in the new map is $key, and its associated value is $value. If the supplied key is xs:untypedAtomic, it is converted to xs:string. If the supplied key is the xs:float or xs:double value NaN, the supplied $map is returned unchanged.

The function map:entry is intended primarily for use in conjunction with the function map:new. For example, a map containing seven entries may be constructed like this:

map:new((
  map:entry("Su", "Sunday"),
  map:entry("Mo", "Monday"),
  map:entry("Tu", "Tuesday"),
  map:entry("We", "Wednesday"),
  map:entry("Th", "Thursday"),
  map:entry("Fr", "Friday"),
  map:entry("Sa", "Saturday")
))

Unlike the map{ ... } expression, this technique can be used to construct a map with a variable number of entries, for example:

map:new(for $b in //book return map:entry($b/isbn, $b))
Examples
  • map:entry("M", "Monday") creates a map with the values { "M":="Monday" }.

map:get

Signatures
  • map:get($map as map(*), $key as item()) as item()*
Summary Returns the value associated with a supplied key in a given map. This function attempts to find an entry within the map supplied as $map that has a key equal to the supplied value of $key. If there is such an entry, it returns the associated value; otherwise it returns an empty sequence. The equality comparison uses the map's collation; no error occurs if the map contains keys that are not comparable with the supplied $key. If the supplied key is xs:untypedAtomic, it is converted to xs:string. If the supplied key is the xs:float or xs:double value NaN, the function returns an empty sequence.

A return value of () from map:get could indicate that the key is present in the map with an associated value of (), or it could indicate that the key is not present in the map. The two cases can be distinguished by calling map:contains. Invoking the map as a function item has the same effect as calling get: that is, when $map is a map, the expression $map($K) is equivalent to get($map, $K). Similarly, the expression get(get(get($map, 'employee'), 'name'), 'first') can be written as $map('employee')('name')('first').

Examples
  • map:get($week, 4) returns "Donnerstag".
  • map:get($week, 9) returns (). (When the key is not present, the function returns an empty sequence.).
  • map:get(map:entry(7,())), 7) returns (). (An empty sequence as the result can also signify that the key is present and the associated value is an empty sequence.).

map:keys

Signatures
  • map:keys($map as map(*)) as xs:anyAtomicType*
Summary Returns a sequence containing all the key values present in a map. The function takes any map as its $map argument and returns the keys that are present in the map as a sequence of atomic values, in implementation-dependent order.
Examples
  • map:keys(map{ 1:="yes", 2:="no" }) returns some permutation of (1,2) (the result is in implementation-dependent order).

map:new

Signatures
  • map:new() as map(*)
  • map:new($maps as map(*)*) as map(*)
  • map:new($maps as map(*)*, $coll as xs:string) as map(*)
Summary Constructs and returns a new map. The zero-argument form of the function returns an empty map whose collation is the default collation in the static context. It is equivalent to calling the one-argument form of the function with an empty sequence as the value of the first argument.

The one-argument form of the function returns a map that is formed by combining the contents of the maps supplied in the $maps argument. It is equivalent to calling the two-argument form of the function with the default collation from the static context as the second argument. The two-argument form of the function returns a map that is formed by combining the contents of the maps supplied in the $maps argument. The collation of the new map is the value of the $collation argument. The supplied maps are combined as follows:

  1. There is one entry in the new map for each distinct key value present in the union of the input maps, where keys are considered distinct according to the rules of the distinct-values function with $collation as the collation.
  2. The associated value for each such key is taken from the last map in the input sequence $maps that contains an entry with this key. If this map contains more than one entry with this key (which can happen if its collation is different from that of the new map) then it is implementation-dependent which of them is selected.

There is no requirement that the supplied input maps should have the same or compatible types. The type of a map (for example map(xs:integer, xs:string)) is descriptive of the entries it currently contains, but is not a constraint on how the map may be combined with other maps.

Examples
  • map:new() creates an empty map.
  • map:new(()) creates an empty map.
  • map:new(map:entry(0, "no"), map:entry(1, "yes")) creates a map with the values { 0:="no", 1:="yes" }.
  • map:new(map:entry(0, "no"), map:entry(1, "yes")) creates a map with the values { 0:="no", 1:="yes" }.
  • map:new(($week, map{ 7:="Unbekannt" })) creates a map with the values { 0:="Sonntag", 1:="Montag", 2:="Dienstag", 3:="Mittwoch", 4:="Donnerstag", 5:="Freitag", 6:="Samstag", 7:="Unbekannt" }.
  • map:new(($week, map{ 6:="Sonnabend" })) creates a map with the values { 0:="Sonntag", 1:="Montag", 2:="Dienstag", 3:="Mittwoch", 4:="Donnerstag", 5:="Freitag", 6:="Sonnabend" }.

map:remove

Signatures
  • map:remove($map as map(*), $key as item()) as map(*)
Summary Constructs a new map by removing an entry from an existing map. The collation of the new map is the same as the collation of the map supplied as $map. The entries in the new map correspond to the entries of $map, excluding any entry whose key is equal to $key.

No failure occurs if the input map contains no entry with the supplied key; the input map is returned unchanged

Examples
  • map:remove($week, 4) creates a map with the values { 0:="Sonntag", 1:="Montag", 2:="Dienstag", 3:="Mittwoch", 5:="Freitag", 6:="Samstag" }.
  • map:remove($week, 23) creates a map with the values { 0:="Sonntag", 1:="Montag", 2:="Dienstag", 3:="Mittwoch", 4:="Donnerstag", 5:="Freitag", 6:="Samstag" }.

map:size

Signatures
  • map:size($map as map(*)) as xs:integer
Summary Returns a the number of entries in the supplied map. The function takes any map as its $map argument and returns the number of entries that are present in the map.
Examples
  • map:size(map:new()) returns 0.
  • map:size(map{ "true":=1, "false":=0 }) returns 2.