使用 XSLT 重构 JSON 有效负载

Restructure JSON Payload Using XSLT

提问人:Yazan Mohammad 提问时间:11/2/2023 最后编辑:Yazan Mohammad 更新时间:11/2/2023 访问量:27

问:

我有下面的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”:“彭博贵金属分类指数” } } }

`

JSON XSLT XSLT-2.0

评论


答:

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>

未测试。请注意,它可能会以不同的顺序生成输出映射中的条目。