nginx 无法动态修改 xml 内容,ngx_http_xslt_module 仅支持基于 xslt 1.0 的服务器端静态转换;可通过 xslt_param 传参实现请求级动态输出,需代理 xml 接口并配置 xslt_stylesheet 与 xslt_types。

确认 xslt 模块已可用
该模块不是默认启用的,需验证:
- 运行
nginx -V 2>&1 | grep with-http_xslt_module,有输出才表示编译时已加入 - 若无,Ubuntu/Debian 推荐安装
nginx-extras包;CentOS/RHEL 需手动编译并带上--with-http_xslt_module - 系统必须装有
libxml2和libxslt运行库(如apt install libxml2 libxslt1.1)
用 xslt_param 传参驱动动态转换
XSLT 本身是静态的,但可通过 Nginx 向样式表注入变量,让同一份 XSLT 输出不同结果。例如按语言切换字段:
- Nginx 配置中添加:
xslt_param lang $arg_lang;(从 URL 参数?lang=zh获取) - XSLT 文件中声明:
<param name="lang" select="'en'"> - 在模板中用
<choose></choose>分支控制内容:<when test="$lang = 'zh">用户</when>
代理 XML 接口 + 实时转换
不服务静态文件,而是对后端返回的 XML 动态加工:
- 配置 location 代理到上游 XML 接口:
proxy_pass http://api/users; - 加上转换指令:
xslt_stylesheet /etc/nginx/xslt/user-list.xsl; - 指定生效类型:
xslt_types application/xml text/xml;(必须与后端实际Content-Type一致) - 强制响应类型(如转成 HTML):
add_header Content-Type text/html;
注意事项与限制
这不是 JavaScript 式的灵活编辑,而是受 XSLT 1.0 严格约束的声明式转换:
- 不支持 XSLT 2.0/3.0 函数(如
replace()、正则匹配),字符串处理靠<value-of></value-of>和<if></if>组合 - 不能修改原始 XML 的命名空间或文档结构以外的元信息(如 XML 声明、注释、处理指令)
- 所有参数值都是字符串,数字或布尔需在 XSLT 中显式判断(如
test="$limit > 10") - 样式表路径必须是绝对路径,不支持变量(
$xslt_path无效)











