XSLT 3.0 原生支持 jsON 转换,核心是 json:json-to-xml() 和 json:xml-to-json() 函数,需声明命名空间 http://www.w3.org/2015/xpath-functions/json 并使用支持 XSLT 3.0 的处理器(如 Saxon 9.8+)。

XSLT 3.0 原生支持 JSON 转换,核心是 xml-to-json() 和 json-to-xml() 两个函数,它们定义在 http://www.w3.org/2015/xpath-functions/json 命名空间下(通常绑定为 json)。使用前需声明命名空间,并确保处理器支持 XSLT 3.0(如 Saxon HE/PE/EE 9.8+、BaseX 9.6+)。
1. 使用 json-to-xml() 将 JSON 字符串转为 XML 格式
该函数把合法的 JSON 文本解析成一个标准的、可查询的 XML 结构(遵循 W3C JSON-to-XML mapping 规则),便于用 XPath 处理。
示例:将 JSON 字符串转为 XML 后提取字段
{$xml-json/map/String[@key='name']} {$xml-json/map/number[@key='age']} {$xml-json/map/Array/string[1]}
注意:
- 输入必须是合法 JSON 字符串(不能是已解析对象);
- 输出 XML 遵循固定结构:
map表示对象,array表示数组,string/number/Boolean/NULL表示值,属性@key保留键名; - 若 JSON 解析失败,函数返回空序列(不会报错),建议配合
try/catch捕获异常。
2. 使用 xml-to-json() 将符合规范的 XML 转回 JSON 字符串
该函数接受一个“JSON-aware” XML 结构(即由 json-to-xml() 生成或严格遵循其 schema 的 XML),输出格式化或紧凑的 JSON 字符串。
示例:构造 XML 再转为 JSON
输出(带缩进):
{ "status": "success", "count": 42, "items": ["apple", "banana"] }
关键点:
- 输入 XML 必须在
http://www.w3.org/2015/xpath-functions/json命名空间中,且结构合规(如map下直接子元素只能是string/number等,不能混用); - 第二个参数是可选的
optionsmap,常用键包括:'indent'(布尔值)、'escape'(是否转义 Unicode)、'liberal'(是否允许非标准结构,仅部分处理器支持); - 若输入 XML 不符合 JSON 映射规则(如 map 中有非 key 属性),函数返回空序列。
3. 实际使用中的常见注意事项
这两个函数不是万能 JSON 工具,需注意边界和限制:
- 不支持 JSON 注释或尾随逗号(非标准语法会解析失败);
- JSON 键名若含特殊字符(如空格、点号),在 XML 中会自动转义为
@key属性,但转回 JSON 时能还原; - XML 到 JSON 时,
liberal模式(如 Saxon 支持)可容忍某些宽松结构,但跨处理器兼容性差,慎用; - 大 JSON 文本转换可能影响性能,避免在循环中反复调用;
- 若需处理流式 JSON 或部分解析,XSLT 3.0 不适用,应改用外部语言或专用 JSON 工具链。
4. 快速验证是否可用
在样式表开头加一段测试代码:
输出 true 表示环境就绪。若为 false,说明处理器版本过低或未启用 XSLT 3.0 模式(如 Saxon 需用 -xsl:3.0 参数或设置 version="3.0")。