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

基于XSLT 3.0(Saxon-HE v11.4)的JSON数组转XML问题求助

解决XSLT 3.0(Saxon-HE)JSON转XML时数组标签丢失的问题

你的问题核心是对json-to-xml()生成的临时XML结构理解偏差,加上模板匹配逻辑的疏漏:

  • 根模板仅直接输出id和department字段,未对Details数组对应的fn:array节点触发模板处理,导致数组部分被忽略
  • 原数组模板错误地直接提取fn:string节点,但数组内部的每个元素是fn:map节点,需要遍历这些map来生成对应的<Details>元素

以下是修正后的XSLT代码:

<?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"
    exclude-result-prefixes="fn" expand-text="yes">
    <xsl:strip-space elements="*" />
    <xsl:output method="xml" omit-xml-declaration="yes"
        indent="yes" />

    <xsl:param name="jsonText" />

    <xsl:template name="init">
        <soap:Envelope
            xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
            xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
            <soap:Body>
                <DataSet xmlns="">
                    <xsl:apply-templates
                        select="json-to-xml($jsonText)" />
                </DataSet>
            </soap:Body>
        </soap:Envelope>
    </xsl:template>

    <!-- 处理json-to-xml生成的顶级map节点 -->
    <xsl:template match="/*">
        <!-- 优先处理Details数组 -->
        <xsl:apply-templates select="fn:array[@key='Details']"/>
        <!-- 输出单个字段 -->
        <id>{fn:string[@key='id']}</id>
        <department>{fn:string[@key='department']}</department>
    </xsl:template>

    <!-- 处理Details数组节点 -->
    <xsl:template match="fn:array[@key='Details']">
        <!-- 遍历数组内的每个对象map -->
        <xsl:for-each select="fn:map">
            <Details>
                <!-- 对单个对象map应用模板提取字段 -->
                <xsl:apply-templates select="."/>
            </Details>
        </xsl:for-each>
    </xsl:template>

    <!-- 处理Details数组中的单个对象map -->
    <xsl:template match="fn:map">
        <Name>{fn:string[@key='Name']}</Name>
        <Address>{fn:string[@key='Address']}</Address>
        <Pin>{fn:string[@key='Pin']}</Pin>
    </xsl:template>
</xsl:stylesheet>

关键改动说明:

  1. 根模板中新增对fn:array[@key='Details']的模板调用,确保数组节点被处理
  2. 数组模板通过xsl:for-each遍历每个fn:map子节点,为每个对象生成一个<Details>容器
  3. 新增fn:map匹配模板,负责提取单个对象的字段并生成对应的XML元素

使用你提供的输入JSON测试,该XSLT将生成完全符合预期的输出XML结构。

内容的提问来源于stack exchange,提问作者prashant kumar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 06:01:06