XPath 3.0 原生支持 map 和 array 类型,扩展了传统序列模型;map 是无序字符串键值对容器,用 ? 访问键;array 是从 1 开始索引的有序集合,用 [] 访问元素;二者均不可变,操作返回新值。

XPath 3.0 原生支持 map 和 array 类型,这是对传统“序列+节点”模型的重要扩展,让 XPath 能更自然地处理类 JSON 的结构化数据。用法不复杂但容易忽略细节。
map:键值对集合,类似字典或对象
map 是无序的键值对容器,键必须是字符串(其他类型会自动转为字符串),值可以是任意 XPath 类型(包括另一个 map 或 array)。
- 创建方式:map { "name": "Alice", "age": 30, "active": true() }
- 取值写法:$m("name") 或 $m?name(推荐后者,更清晰)
- 嵌套访问:$m?address?city(假设 address 本身也是 map)
- 检查键是否存在:map:contains($m, "email")
- 更新值(返回新 map,不可变):map:put($m, "score", 95)
array:有序索引集合,类似列表或数组
array 是从 1 开始索引的有序序列(注意:不是 0!),支持随机访问、切片和追加。
- 创建方式:["apple", "banana", "cherry"] 或 array { "x", "y" }
- 取值写法:$a[1](第一个元素)、$a[2 to 3](切片)、$a?size()(长度)
- 追加元素:array:append($a, "date")(返回新 array)
- 遍历处理:array:for-each($a, function($x) { upper-case($x) })
- 与 map 混用很常见:$users[1]?profile?roles[1](假设 users 是 array,每个元素含 profile map)
实用组合技巧
map 和 array 经常一起出现,尤其在处理 JSON 转换后的 XML 结构(如用 json-to-xml())时:
- 把 JSON 数组转成 XPath array:json-to-xml('{ "items": [1,2,3] }')//*:array → 再用 array { ... } 构造
- 过滤 map 列表:$users[?status = "active"]($users 是 array of map)
- 构造带默认值的 map:map:merge(( $base, map { "id": uuid() } ))
基本上就这些。关键记住:map 用 ? 访问键,array 用 [ ] 索引(从 1 开始),所有操作都返回新值——XPath 3.0 的 map/array 是不可变的。










