XPath 3.0中的map和array怎么用

10次阅读

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

XPath 3.0中的map和array怎么用

XPath 3.0 原生支持 maparray 类型,这是对传统“序列+节点”模型的重要扩展,让 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 是不可变的。

text=ZqhQzanResources