You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用XSLT/XPath 3.0将URL查询字符串解析为参数映射的最优实现

XSLT/XPath 3.0+ 查询字符串解析实现

以下是可读性最优的实现方案,完全符合多值参数解析要求,逻辑分层清晰,无冗余操作:

核心实现代码

declare function local:parse-query-string($query as xs:string?) as map(xs:string, xs:string*) {
  (: 处理空输入直接返回空映射 :)
  if (empty($query) or normalize-space($query) = '') then map{}
  else
    let $clean-query := replace($query, '^\?', '') (: 兼容带开头问号的输入格式 :)
    let $raw-pairs := tokenize($clean-query, '&') (: 拆分所有键值对 :)
    let $valid-pairs := 
      for $pair in $raw-pairs
      where normalize-space($pair) != '' (: 跳过空项,兼容末尾带&的异常输入 :)
      let $kv := tokenize($pair, '=', 2) (: 仅拆分第一个=,避免值包含=时解析错误 :)
      let $key := decode-uri($kv[1])
      let $value := if (count($kv) = 2) then decode-uri($kv[2]) else ''
      return map{ 'key': $key, 'value': $value }
    (: 按key分组生成最终映射,相同key的值自动合并为序列 :)
    return map:merge(
      for $group in $valid-pairs
      group by $current-key := $group?key
      return map{ $current-key: $group?value }
    )
};

实现特性说明

  • 输入兼容多种格式:支持带开头?、不带开头?、末尾带多余&的异常输入
  • 多值参数自动处理:相同参数名的多个值会自动合并为xs:string*序列,例如输入a=1&a=2,返回映射中a对应的值为("1", "2")
  • 特殊场景兼容:参数值包含=、参数值为空、参数含URL编码字符的场景都可以正常解析
  • 全标准函数实现:所有调用的函数均为XPath 3.0+ 标准函数,无需额外依赖,主流XSLT/XPath处理器(Saxon、BaseX等)均可直接运行

测试示例

输入查询字符串:?a=1&a=2&b=hello%20world&c=&d=test=123
返回结果:

map{
  "a": ("1", "2"),
  "b": "hello world",
  "c": "",
  "d": "test=123"
}

内容的提问来源于stack exchange,提问作者Martynas Jusevičius

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 10:24:02