Iterating over maps and arrays

The three instructions xsl:for-each, xsl:iterate, and xsl:for-each-group can take an attribute array or map in place of the select attribute.

If array is specified, the instruction iterates over the selected array. Specifically, the body of the instruction is evaluated with the context item being a parcel containing the items making up the corresponding member of the array; these items may be extracted with the fn:unparcel() function, or simply with the lookup expression ?value. For example:

<xsl:for-each array="[1, 3 to 5, 10 to 20, 31 to 32]" separator=" "> {count(?value)} </xsl:for-each>

outputs 1 3 11 2.

If map is specified, the instruction iterates over the selected map. Specifically, the body of the instruction is evaluated with the context item being a map containing two entries: an entry named "key" holding the key, and an entry named "value" holding the corresponding value. The order of entries is undefined (but <xsl:sort select="?key"/> can be used to sort them).