XPath 3.0引入的map和array是两种重要的复合数据结构,map用于存储键值对集合,array用于存储有序的元素序列,两者让XPath可以处理更复杂的数据组织需求,不再局限于简单的节点和标量值操作。

XPath 3.0中map的使用方法
创建map
map的创建使用map{key1:value1, key2:value2}的语法,键可以是字符串、数值或者QName,值可以是任意XPath合法的表达式结果。
(: 创建包含三个键值对的map :)
let $user-map := map{"name":"张三", "age":25, "isStudent":true()}
return $user-map
访问map元素
访问map中的元素有两种方式,一种是使用map:key的语法,另一种是使用map:get(map, key)函数。
let $user-map := map{"name":"张三", "age":25}
return (
$user-map("name"), (: 返回"张三" :)
map:get($user-map, "age") (: 返回25 :)
)
修改map
map是不可变的,修改map会返回一个新的map,可以使用map:put(map, key, value)函数添加或修改键值对,使用map:remove(map, key)函数删除指定键。
let $origin-map := map{"a":1, "b":2}
let $new-map := map:put($origin-map, "c", 3) (: 新增键c :)
let $removed-map := map:remove($origin-map, "a") (: 删除键a :)
return ($new-map, $removed-map)
XPath 3.0中array的使用方法
创建array
array的创建使用[item1, item2, item3]的语法,元素可以是任意XPath合法的表达式结果,array是有序的,元素位置从1开始计数。
(: 创建包含三个元素的array :) let $score-array := [90, 85, 95] return $score-array
访问array元素
访问array元素使用array[index]的语法,也可以使用array:get(array, index)函数,索引超出范围会返回空序列。
let $score-array := [90, 85, 95] return ( $score-array[1], (: 返回90 :) array:get($score-array, 2) (: 返回85 :) )
修改array
array同样是不可变的,修改会返回新的array,可以使用array:append(array, item)在末尾添加元素,使用array:subarray(array, start, length)截取子数组,使用array:put(array, index, item)修改指定位置的元素。
let $origin-array := [1, 2, 3] let $append-array := array:append($origin-array, 4) (: 末尾添加4,结果[1,2,3,4] :) let $sub-array := array:subarray($origin-array, 1, 2) (: 截取前两个元素,结果[1,2] :) let $put-array := array:put($origin-array, 2, 10) (: 修改第二个元素为10,结果[1,10,3] :) return ($append-array, $sub-array, $put-array)
map和array的常用场景区别
map适合存储有明确标识的关联数据,比如对象的属性集合,通过键快速获取对应值;array适合存储有序的同类数据集合,比如列表、序列类数据,需要按位置顺序处理元素。如果需要判断某个键是否存在,可以使用map:contains(map, key)函数,处理array的遍历可以结合fn:for-each函数实现。
(: 遍历array并每个元素加1 :)
let $arr := [1,2,3]
return fn:for-each($arr, function($x) { $x + 1 }) (: 返回[2,3,4] :)