ngx_http_xslt_module不支持XML转JSON,仅能通过XSLT 1.0手动拼接模拟JSON字符串;需配置xslt_stylesheet、xslt_types及Content-Type,并注意编码、转义与MIME匹配。

ngx_http_xslt_module 本身不支持直接将 XML 转为 JSON,它只负责用 XSLT(1.0)对 XML 做结构变换,输出仍是 XML。若要在 Nginx 网关层实现“XML → JSON”的动态转换,必须借助 XSLT 1.0 的字符串拼接能力模拟 JSON 格式,属于一种受限但可行的 hack 方式。
明确模块能力边界
该模块仅执行 XSLT 1.0 变换,不内置 JSON 序列化函数,也不支持 JavaScript 或外部调用。所有 JSON 字符串(包括引号、逗号、花括号、转义)都需手动构造:
- XSLT 输出必须设为
text/plain或application/json,避免浏览器/客户端误解析为 XML - 所有双引号需写成
",反斜杠、换行等特殊字符需手动转义 - 数组需靠
<for-each></for-each>拼接逗号分隔项;对象靠嵌套<element></element>或文本拼接 - 无法自动处理 null、布尔值、数字类型推断——所有内容均为字符串,需上游保证格式或在 XSLT 中硬编码类型逻辑
配置 Nginx 启用 XSLT 转换
确保编译时已启用模块(--with-http_xslt_module),并在 location 中配置:
location /api/xml-to-json {
# 原始后端返回 XML
proxy_pass http://backend/xml-endpoint;
<pre class="brush:php;toolbar:false;"># 启用 XSLT 处理(仅对 text/xml 或 application/xml 响应生效)
xslt_stylesheet /etc/nginx/xslt/xml-to-json.xsl;
# 强制覆盖响应 Content-Type
add_header Content-Type application/json;
xslt_types application/xml text/xml;}
注意:xslt_types 必须匹配后端实际返回的 Content-Type,否则不触发转换。
编写 XSLT 模拟 JSON 输出
以下是一个简化示例:将 <user><id>123</id><name>Alice</name></user> 转为 {"id":"123","name":"Alice"}:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<p><xsl:output method="text" encoding="UTF-8"/></p><p><xsl:template match="/user">
<xsl:text>{"id":"</xsl:text>
<xsl:value-of select="id"/>
<xsl:text>","name":"</xsl:text>
<xsl:value-of select="name"/>
<xsl:text>"}</xsl:text>
</xsl:template></p><p></xsl:stylesheet>关键点:
- 使用
<output method="text"></output>避免生成 XML 声明或标签 - 所有 JSON 符号(
{、}、:、,、")均用<text></text>显式写出 - 动态字段值用
<value-of></value-of>插入,注意手动包裹双引号 - 复杂嵌套需多层
<template></template>+<apply-templates></apply-templates>控制流程
应对常见限制的实用建议
该方案适合简单、固定结构的 XML 转换。面对真实场景,需主动规避短板:
- 避免深层嵌套或变长数组:XSLT 1.0 缺乏 map/array 数据结构,循环拼接 JSON 数组易出错,建议前端或后端承担复杂结构序列化
-
统一编码与转义:在 XSLT 中用
translate()手动替换换行符、制表符、反斜杠,例如translate(., ' ', '\n\r\\') -
错误兜底:Nginx 不校验 XSLT 输出合法性。可在 XSLT 开头加
<if test="not(/user)>{" error></if>提供基础容错 - 性能考量:每次请求触发 XSLT 解析+执行,高并发下 CPU 开销明显,不宜用于高频、大数据量接口
不复杂但容易忽略:真正落地时,90% 的问题来自 MIME 类型不匹配、XSLT 编码声明与 Nginx 不一致、或特殊字符未转义导致 JSON 格式损坏。务必用 curl -i 直接验证响应头与原始 body。


















