基于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>
关键改动说明:
- 根模板中新增对
fn:array[@key='Details']的模板调用,确保数组节点被处理 - 数组模板通过
xsl:for-each遍历每个fn:map子节点,为每个对象生成一个<Details>容器 - 新增
fn:map匹配模板,负责提取单个对象的字段并生成对应的XML元素
使用你提供的输入JSON测试,该XSLT将生成完全符合预期的输出XML结构。
内容的提问来源于stack exchange,提问作者prashant kumar
相关产品推荐
相关产品推荐

