xslt可通过字符串拼接(1.0/2.0)或原生map/array+xml-to-json(3.0)生成json;需严格遵循语法、转义特殊字符、控制逗号与空白,并确保utf-8编码。

XSLT 本身不原生支持 JSON 输出,但可以通过字符串拼接和规范格式化,在 XSLT 1.0/2.0/3.0 中生成合法的 JSON 文本。关键在于:严格遵循 JSON 语法规则(如双引号、转义、无尾逗号)、正确处理特殊字符,并避免依赖外部扩展函数(除非明确环境支持)。
用 XSLT 2.0+ 手动构造 JSON 对象
适用于结构较固定、数据量不大的场景。核心是用 <text></text> 和 <value-of></value-of> 拼接键值对,手动添加引号、冒号、逗号和花括号。
- 所有字符串键和值必须用双引号包裹,不能用单引号
- 值中的双引号、反斜杠、换行符等需转义:
"→",→\,→ - 用
<if test="position() != last()">,</if>控制数组元素间逗号,避免末尾多余逗号
示例(XSLT 2.0):将 XML 中的 <person></person> 转为 JSON 对象
<xsl:template match="person"> {"name": "<xsl:value-of select="name"/>", "age": <xsl:value-of select="age"/>, "active": <xsl:value-of select="if (active='true') then 'true' else 'false'"/> } </xsl:template>
用 XSLT 3.0 的 map/array + json-to-xml 函数(推荐)
XSLT 3.0 内置了原生 JSON 支持:可先构建 map{} 或 array{} 数据结构,再用 xml-to-json()(注意:是 xml-to-json,不是 json-to-xml)将其序列化为 JSON 字符串。
- 需将数据先转为符合 W3C JSON ML 格式 的 XML 结构(如
<map><string key="name">Alice</string><number key="age">30</number></map>) - 然后调用
xml-to-json($json-ml, map{'indent':true()})输出美化后的 JSON - 此方式安全、可读性强,自动处理转义与类型推断
规避常见陷阱
手动生成 JSON 容易出错,以下细节必须检查:
-
引号嵌套错误:不要在属性值中直接写双引号,改用
"实体或<text>"</text> -
空格与换行:XSLT 默认可能插入多余空白,用
<strip-space elements="*"></strip-space>和<output method="text" indent="no"></output>控制输出纯净性 -
数值类型混淆:JSON 中数字不带引号,字符串必须带;用
number()或类型判断确保age不被当成字符串输出 -
编码问题:确保 XSLT 处理器输出 UTF-8,且
<output encoding="UTF-8"></output>显式声明
替代方案:XSLT 生成中间 XML 再转换
若 XSLT 环境受限(如仅支持 XSLT 1.0),更稳健的做法是:
- 先用 XSLT 生成标准 XML(如符合 JSON ML 规范的结构)
- 再用命令行工具(如
jq、python -m json.tool)或服务端代码(Java/Python)将该 XML 转为 JSON - 既保持 XSLT 简洁性,又避免手工拼接 JSON 的脆弱性










