提问人:Yazan Mohammad 提问时间:11/2/2023 最后编辑:Yazan Mohammad 更新时间:11/2/2023 访问量:27
使用 XSLT 重构 JSON 有效负载
Restructure JSON Payload Using XSLT
问:
我有下面的JSON有效负载,我正在尝试将其重构为第二种格式
{ "data":{ "USDCHF:CUR":{ "PX_LAST":104.4872, "CHG_PCT_1D":0.3148063, "CHG_NET_1D":0.3279, "LONG_COMP_NAME":"Bloomberg Commodity Index" }, "BCOMPR:IND":{ "PX_LAST":217.4836, "CHG_PCT_1D":0.4914518, "CHG_NET_1D":1.0636, "LONG_COMP_NAME":"Bloomberg Precious Metals Subindex" } } }
- 第二种格式: ` { “数据”:{ “代码”:{ “Ticker_Name”:“USDCHF:CUR”, “PX_LAST”:104.4872, “CHG_PCT_1D”:0.3148063, “CHG_NET_1D”:0.3279, “LONG_COMP_NAME”:“彭博大宗商品指数” }, “代码”:{ “Ticker_Name”:“BCOMPR:IND”, “PX_LAST”:217.4836, “CHG_PCT_1D”:0.4914518, “CHG_NET_1D”:1.0636, “LONG_COMP_NAME”:“彭博贵金属分类指数” } } }
`
答:
1赞
Michael Kay
11/2/2023
#1
XSLT 2.0 没有任何分析或转换 JSON 的功能。为此,您需要 XSLT 3.0。您是否有权使用 XSLT 3.0 处理器?
然后有一个问题,你想要的输出是无效的JSON:“data”对象的值使用键“Ticker”两次。
如果我们将所需的输出更改为:
{
"data": {
"Ticker1": {
"Ticker_Name": "USDCHF:CUR",
"PX_LAST": 104.4872,
"CHG_PCT_1D": 0.3148063,
"CHG_NET_1D": 0.3279,
"LONG_COMP_NAME": "Bloomberg Commodity Index"
},
"Ticker2": {
"Ticker_Name": "BCOMPR:IND",
"PX_LAST": 217.4836,
"CHG_PCT_1D": 0.4914518,
"CHG_NET_1D": 1.0636,
"LONG_COMP_NAME": "Bloomberg Precious Metals Subindex"
}
}
}
然后可以在 XSLT 3.0 中使用以下代码解决它:
<xsl:output method="json"/>
<xsl:template name="xsl:initial-template">
<xsl:variable name="in" select="parse-json(...)"/>
<xsl:map>
<xsl:map-entry key="'data'>
<xsl:for-each select="map:keys($in?data)">
<xsl:copy-of select="$in?data(.)
=> map:put('Ticker'||position(), .)"/>
</xsl:for-each>
</xsl:map-entry>
</xsl:map>
</xsl:template>
未测试。请注意,它可能会以不同的顺序生成输出映射中的条目。
评论