如何在XSLT 3.0中从JSON数组提取数据并生成指定XML
使用Saxon-HE v11.4(XSLT 3.0)实现JSON转指定格式XML
需求说明
- 基于Java环境,借助Saxon-HE v11.4库的XSLT 3.0能力,将包含数组结构的JSON转换为指定格式的XML
- 提取JSON数组中的每个元素,为对应的XML节点添加数组索引属性
indexarray
输入输出示例
输入JSON
{ "Details":{ "name":["a","b","c"] } }
期望输出XML
<Details> <name indexarray="0">a</name> <name indexarray="1">b</name> <name indexarray="2">c</name> </Details>
XSLT 3.0转换脚本
创建json-to-xml.xsl文件,内容如下:
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:map="http://www.w3.org/2005/xpath-functions/map" xmlns:array="http://www.w3.org/2005/xpath-functions/array" exclude-result-prefixes="map array"> <xsl:output method="xml" indent="yes"/> <!-- 主模板:将输入JSON转换为临时XML结构后继续处理 --> <xsl:template match="/"> <xsl:variable name="json-xml" select="json-to-xml(.)"/> <xsl:apply-templates select="$json-xml/*"/> </xsl:template> <!-- 处理Details节点 --> <xsl:template match="*[@key='Details']"> <Details> <xsl:apply-templates select="*"/> </Details> </xsl:template> <!-- 遍历name数组,生成带索引属性的name节点 --> <xsl:template match="*[@key='name' and array:is-array(.)]"> <xsl:for-each select="array:flatten(.)/*"> <name indexarray="{position() - 1}"> <xsl:value-of select="."/> </name> </xsl:for-each> </xsl:template> </xsl:stylesheet>
Java调用代码示例
引入依赖(Maven)
<dependency> <groupId>net.sf.saxon</groupId> <artifactId>Saxon-HE</artifactId> <version>11.4</version> </dependency>
转换执行代码
import net.sf.saxon.s9api.*; import java.io.File; import java.io.FileOutputStream; public class JsonToXmlConverter { public static void main(String[] args) throws Exception { // 初始化Saxon处理器 Processor processor = new Processor(false); XsltCompiler compiler = processor.newXsltCompiler(); // 加载XSLT转换脚本 XsltExecutable executable = compiler.compile(new File("json-to-xml.xsl")); XsltTransformer transformer = executable.load(); // 读取输入JSON文件 DocumentBuilder builder = processor.newDocumentBuilder(); XdmNode input = builder.build(new File("input.json")); transformer.setInitialContextNode(input); // 设置XML输出目标 Serializer serializer = processor.newSerializer(new FileOutputStream("output.xml")); serializer.setOutputProperty(Serializer.Property.INDENT, "yes"); transformer.setDestination(serializer); // 执行转换 transformer.transform(); } }
内容的提问来源于stack exchange,提问作者user20527766
相关产品推荐
相关产品推荐

