如何使用XSL将JSON转换为以键名为标签的自定义XML结构?
解决方案
不需要额外执行第二次XSL转换,你可以在同一份XSLT 3.0样式表内完成「JSON转中间XML」+「中间节点转目标结构」两步逻辑,一步生成期望的输出。
修正后的XSL代码
<?xml version="1.0"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fn="http://www.w3.org/2005/xpath-functions" xmlns:math="http://www.w3.org/2005/xpath-functions/math" xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs math fn" version="3.0"> <xsl:output indent="yes" omit-xml-declaration="yes" /> <!-- 匹配根data节点,先转JSON为中间XML,再应用转换模板 --> <xsl:template match="data"> <xsl:apply-templates select="json-to-xml(.)/fn:map/fn:*" /> </xsl:template> <!-- 匹配JSON对象对应的map节点,用key属性作为新标签名 --> <xsl:template match="fn:map[@key]"> <xsl:element name="{@key}"> <xsl:apply-templates select="fn:*" /> </xsl:element> </xsl:template> <!-- 匹配JSON字符串/数值等类型节点,用key属性作为新标签名,保留文本内容 --> <xsl:template match="fn:*[@key and not(*)]"> <xsl:element name="{@key}"> <xsl:value-of select="." /> </xsl:element> </xsl:template> </xsl:stylesheet>
代码说明
- 首先给
http://www.w3.org/2005/xpath-functions命名空间声明fn前缀,用于匹配json-to-xml()生成的默认带命名空间的节点 - 不再直接
copy-of输出中间XML,而是对中间节点树应用自定义模板 - 通用模板自动将所有带
key属性的节点转换为以key值为标签名的节点,同时递归处理子节点,适配嵌套的JSON结构
注意事项
如果你的实际JSON数据中存在不符合XML元素命名规范的键名(如包含空格、数字开头、特殊符号等),需要在生成<xsl:element>前对@key值做合法性转义处理,避免转换报错。
内容的提问来源于stack exchange,提问作者Red
相关产品推荐
相关产品推荐

