如何使用XSLT3与SaxonJS实现JSON转XML?
解决XSLT 3 + SaxonJS CLI转换JSON到XML的空输出问题
问题根源
当你用-json参数传入JSON文件时,SaxonJS会将JSON解析为XPath 3.1的映射/数组类型,而非传统的XML节点树。你之前的模板写法错误,导致处理器无法正确处理输入的JSON数据:
- 第一个模板
match="/":针对XML根节点设计,但输入是JSON,没有XML节点,所以模板根本不会执行 - 第二个模板
match=".":虽然匹配当前节点,但缺少明确的入口触发,且没有确保处理器识别映射类型的匹配逻辑
正确实现方案
下面提供两种可靠的写法,都能正确转换你的测试JSON:
方案1:使用初始模板(推荐)
XSLT 3的xsl:initial-template是专门为无XML输入场景设计的入口模板,直接处理解析后的JSON映射:
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" version="3.0"> <xsl:template name="xsl:initial-template"> <base> <a> <!-- 用XPath 3.1的?运算符获取映射中"a"键的值 --> <xsl:value-of select="?a"/> </a> </base> </xsl:template> </xsl:stylesheet>
方案2:匹配映射类型节点
通过模板匹配条件明确识别输入的JSON映射,同时使用XSLT 3的文本值模板简化写法:
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" version="3.0"> <!-- 匹配输入的JSON映射对象 --> <xsl:template match=".[. instance of map(xs:string, item())]"> <base> <!-- 文本值模板直接插入映射值 --> <a>{?a}</a> </base> </xsl:template> </xsl:stylesheet>
执行与输出
保持你原来的命令不变:
npm i xslt3 ./node_modules/.bin/xslt3 -json:test.json -xsl:test.xsl -o:test.xml -t && cat test.xml
执行后会生成正确的XML:
<base> <a>1</a> </base>
关于版本的说明
SaxonJS 2.7.0完全支持XSLT 3和XPath 3.1的映射操作,你的问题与版本无关,仅为模板写法错误。
内容的提问来源于stack exchange,提问作者Mark
相关产品推荐
相关产品推荐

