You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 11:58:14