如何在XSLT中获取JSON后重命名其键名
用XSLT重命名JSON中的键名
要实现读取指定JSON并将第一个成员的age键重命名为membersAge,可以借助XSLT 3.0的JSON与XML互转功能完成,具体代码及说明如下:
<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="json" indent="yes"/> <!-- 读取输入的JSON文件并启动处理流程 --> <xsl:template match="/"> <!-- 将JSON转换为XML结构,方便用XSLT节点操作修改内容 --> <xsl:variable name="json-xml" select="json-to-xml(unparsed-text('input.json'))"/> <!-- 处理XML结构,修改指定键名 --> <xsl:variable name="modified-xml"> <xsl:apply-templates select="$json-xml/node()"/> </xsl:variable> <!-- 将修改后的XML转换回带缩进的JSON格式 --> <xsl:value-of select="xml-to-json($modified-xml, map{'indent': true()})"/> </xsl:template> <!-- 匹配members数组的第一个成员对象,专门处理它的键名 --> <xsl:template match="array[@key='members']/object[1]"> <object> <!-- 遍历对象的所有字段 --> <xsl:for-each select="*"> <!-- 把age字段替换成membersAge,其他字段保持原样 --> <xsl:element name="{if (local-name()='age') then 'membersAge' else local-name()}"> <xsl:apply-templates select="@*|node()"/> </xsl:element> </xsl:for-each> </object> </xsl:template> <!-- 其他节点直接原样复制,不做修改 --> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> </xsl:stylesheet>
关键逻辑说明
- JSON转XML:通过
json-to-xml函数将输入JSON转为XML结构,比如原JSON的members数组会变成<array key="members">,成员对象是<object>,age字段对应<age>元素,这样就能用XSLT的节点处理能力修改内容。 - 修改键名:专门匹配第一个成员对象,遍历其所有子元素时,将
age元素替换为membersAge,其他元素保持不变。 - XML转回JSON:用
xml-to-json函数把修改后的XML重新转为JSON格式,输出带缩进的易读结果。
输出示例
运行上述XSLT后,输出的JSON中第一个成员的age会被替换为membersAge,其余内容保持原样:
{ "squadName": "Super hero squad", "homeTown": "Metro City", "formed": 2016, "secretBase": "Super tower", "active": true, "members": [ { "name": "Molecule Man", "membersAge": 29, "secretIdentity": "Dan Jukes", "powers": ["Radiation resistance", "Turning tiny", "Radiation blast"] }, { "name": "Madame Uppercut", "age": 39, "secretIdentity": "Jane Wilson", "powers": [ "Million tonne punch", "Damage resistance", "Superhuman reflexes" ] } ] }
注意:需要使用支持XSLT 3.0的处理器(如Saxon HE/PE/EE)才能运行这段代码,json-to-xml和xml-to-json是XSLT 3.0的标准内置函数。
内容的提问来源于stack exchange,提问作者Ram Prasad
相关产品推荐
相关产品推荐

