Re: [xsl] Please help me understand maps

Subject: Re: [xsl] Please help me understand maps
From: Michael Kay <mike@xxxxxxxxxxxx>
Date: Wed, 14 Aug 2013 18:47:49 +0100
Yes, you've worked out the spec by induction.

map:new() takes a collection of maps and concatenates them into a single map.
There are a number of usage patterns, one is to concatenate a set of singleton
maps representing individual map entries, another is to concatenate a ("real")
map and a singleton map, etc.

The design aimed to avoid introducing a "map entry" or "key value pair" as a
separate kind of object, since it can be adequately represented by a map
containing a single entry.

Michael Kay
Saxonica


On 14 Aug 2013, at 18:30, Costello, Roger L. wrote:

> Hi Folks,
>
> My understanding of a map is that it is an object containing a bunch of
key/value pairs.
>
> That seems pretty simple.
>
> In the XSLT 3.0 specification it has this example:
>
> <xsl:variable name="isbn-index" as="map(xs:string, element(book))"
>
> Okay, $isbn-index is that name of a map. The keys for that map must be
strings and the value associated to each key must be a <book> element.
>
> Got it.
>
> Then the example assigns $isbn-index a value:
>
>    select="map:new(for $b in //book return map{$b/isbn := $b})"/>
>
> Yikes!
>
> What is that?
>
> Let me try to parse it:
>
> Step 1. Create a new map. That's what "map:new(...)" does.
>
> Step 2. Loop through each <book> element. That's what "for $b in //book
return ..." does.
>
> Step 3. For each <book> element create a map. That's what "map{$b/isbn :=
$b}" does. Huh?
>
> Step 1 creates a new map, so it should be assigned a bunch of key/value
pairs, right? Step 3 is blasting it with a bunch of maps. Huh? Where are the
new map's key/value pairs? I don't get it. Please help.
>
> Oh! Perhaps since each "inner map" object contains just one key/value pair,
each inner map object gets "unwrapped" to yield its key/value pair to the
"outer map" object. Ha! How do you like that theory?
>
> /Roger

Current Thread