如何使用Saxon XSLT处理数组结构的JSON输入
针对JSON数组的Saxon XSLT处理方案
针对你提到的以数组开头的JSON,当使用Saxon的-json:myfile.json命令行参数时,Saxon会自动将其转换为带http://www.w3.org/2005/xpath-functions命名空间的XML结构(即你展示的<array>根节点格式),无需手动调用json-to-xml。以下是编写XSLT模板处理该结构的具体方法:
1. 匹配根节点的模板
根节点是命名空间下的<array>元素,必须通过正确的命名空间前缀来匹配:
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fn="http://www.w3.org/2005/xpath-functions"> <!-- 绑定JSON转换后的命名空间 --> <!-- 匹配转换后的XML根节点:<fn:array> --> <xsl:template match="/fn:array"> <!-- 定义输出的根结构,比如自定义的<events> --> <events> <!-- 触发对所有子节点(每个<fn:map>,对应JSON里的单个对象)的处理 --> <xsl:apply-templates select="fn:map"/> </events> </xsl:template>
2. 处理子项的模板
接下来编写匹配<fn:map>的模板,处理每个JSON对象:
<!-- 匹配每个<fn:map>节点(对应JSON数组中的单个对象) --> <xsl:template match="fn:map"> <event> <!-- 直接提取指定key的字段值 --> <event-id><xsl:value-of select="fn:string[@key='eid']"/></event-id> <category><xsl:value-of select="fn:string[@key='ecat']"/></category> <timestamp><xsl:value-of select="fn:string[@key='day']"/></timestamp> <time><xsl:value-of select="fn:string[@key='time']"/></time> <title><xsl:value-of select="fn:string[@key='text']"/></title> <!-- 其他字段可按同样方式提取 --> </event> </xsl:template> </xsl:stylesheet>
3. 关键细节
- 命名空间必须声明:JSON转换后的所有节点都属于
http://www.w3.org/2005/xpath-functions命名空间,因此必须在XSLT中声明该命名空间的前缀(示例中用fn:),否则无法匹配节点。 apply-templates的作用:在根节点模板中调用<xsl:apply-templates select="fn:map"/>,会自动遍历所有<fn:map>节点,并触发对应的模板处理每个节点。- 灵活扩展:如果需要对所有
<fn:string>节点做统一处理,也可以在<fn:map>模板中添加<xsl:apply-templates select="fn:string"/>,再单独编写匹配<fn:string>的模板。
4. 运行命令
使用Saxon命令行工具执行转换:
java -jar saxon-he-12.x.jar -json:myfile.json -xsl:your-transform.xsl -o:output.xml
内容的提问来源于stack exchange,提问作者wknauf
相关产品推荐
相关产品推荐

