使用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
相关产品推荐
相关产品推荐

