ngx_http_xslt_module无法生成合法JSON,因其仅支持XSLT 1.0,而该标准缺乏JSON必需的对象建模、字符串转义、null处理等能力,强行拼接易导致无效JSON。

ngx_http_xslt_module 本身不支持将 XML 直接转为 JSON。它仅能通过 XSLT(1.0)将 XML 转换为其他 XML、HTML 或纯文本格式,而标准 XSLT 1.0 **没有原生 JSON 序列化能力**。因此,在 Nginx 网关层用该模块“直接输出 JSON”是不可行的。
为什么 ngx_http_xslt_module 无法生成合法 JSON
XSLT 1.0 不提供对象/数组结构建模、字符串转义(如双引号、换行符)、null 处理或 Unicode 编码控制等 JSON 必需特性。即使强行用模板拼出类似 JSON 的字符串,也极易因特殊字符、嵌套层级或编码问题导致无效 JSON(例如未转义的 " 或 \n),下游解析会失败。
可行的替代方案(推荐在网关层落地)
若必须在 Nginx 层完成 XML→JSON 转换,应绕过 ngx_http_xslt_module,改用更灵活的模块:
- 使用 ngx_http_perl_module(已弃用但仍可用):嵌入 Perl 脚本,调用 XML::LibXML 和 JSON 模块解析并转换,可控性强;需启用 Perl 支持并注意性能与安全隔离。
-
使用 OpenResty + lua-resty-xml + cjson:最主流实践。通过
access_by_lua_block或body_filter_by_lua_block拦截响应体,用 Lua 解析 XML 并构造 JSON。示例逻辑:- 读取 upstream 返回的 XML body
- 用
xml.parse解析为 Lua table - 用
cjson.encode序列化为 JSON 字符串 - 设置
Content-Type: application/json并替换响应体
- 反向代理前加轻量转换服务(推荐):在 Nginx 后部署一个极简 HTTP 服务(如 Python Flask/FastAPI + xmltodict + json),Nginx 将 XML 请求先代理给它,转换后再返回 JSON。运维清晰、调试方便、语言生态成熟。
如果坚持用 XSLT,只能生成“类 JSON 文本”(不推荐)
仅适用于格式极其简单、无特殊字符、无嵌套、且下游可容忍非标格式的测试场景。例如:
- 编写 XSLT 模板,手动拼接
{"name":"${value}"}结构 - 对 value 做基础替换(如将
"替换为\"),但无法覆盖所有 JSON 转义规则 - 设置
Content-Type: application/json—— 实际内容可能非法
这种做法违反 JSON 规范,生产环境务必避免。
总结建议
放弃用 ngx_http_xslt_module 做 XML→JSON。选择 OpenResty + Lua 方案可保留在 Nginx 生态内完成转换;若追求稳定与可维护性,用独立转换服务更可靠。核心原则:让专业工具做专业事 —— XML 解析和 JSON 序列化不是 XSLT 的设计目标。











