XSLT 3.0 - 无法在 XSLT 3.0 xml-to-json() 中获取对象数组

Posted

技术标签:

【中文标题】XSLT 3.0 - 无法在 XSLT 3.0 xml-to-json() 中获取对象数组【英文标题】:XSLT 3.0 - Not able to get Array of objects in XSLT 3.0 xml-to-json() 【发布时间】:2021-11-08 19:25:58 【问题描述】:

我正在尝试使用 XSLT 3.0 将给定的 json 数据从一种形式转换为另一种形式。我正在使用 XSLT 3.0 提供的 json-to-xml 和 xml-to-json 函数将数据从 .to json 转换为 xml。

我有以下 json 数据。

 
   "id": "123456",
   "result": "Success"
  

我正在尝试使用 XSLT 3.0 将其转换为以下形式

[
  
   "key":"id",
   "value":"123456"
  ,
  
    "key":"result",
    "value":"Success"
   
 ]

我有以下 XSLT。

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  version="3.0"
  xmlns="http://www.w3.org/2005/xpath-functions"
  xpath-default-namespace="http://www.w3.org/2005/xpath-functions"
  expand-text="yes">
  <xsl:param name="json"/>

  <xsl:output method="text"/>


   <xsl:mode on-no-match="shallow-skip"/>

   <xsl:template match="/" name="init">
    <xsl:variable name="json-xml" select="json-to-xml($json)"/>
    <xsl:variable name="transformed-json-xml">
     <map>
      <xsl:apply-templates select="$json-xml//map"/>
     </map>
    </xsl:variable>
    <xsl:value-of select="xml-to-json($transformed-json-xml, map  'indent' : true() )"/>
   </xsl:template>

    <xsl:template match="map[string[@key = 'id'] and string[@key = 'result']]">
    <string key="key">id</string>
    <string key="value">string[@key = 'id']</string>
    </xsl:template>

   </xsl:stylesheet>

但它只产生一个对象

  "key" : "id",
"value" : "123456" 

谁能指出我需要修改的地方?

【问题讨论】:

【参考方案1】:

好吧,如果你想要一个数组作为你需要改变的外部 JSON 结构

<xsl:variable name="transformed-json-xml">
 <map>
  <xsl:apply-templates select="$json-xml//map"/>
 </map>

<xsl:variable name="transformed-json-xml">
 <array>
  <xsl:apply-templates select="$json-xml//map"/>
 </array>

你想要的地图

<xsl:template match="map[string[@key = 'id'] and string[@key = 'result']]">
  <xsl:apply-templates/>
</xsl:template>

  <xsl:template match="string">
    <map>
      <string key="key">@key</string>
      <string key="value">.</string>
    </map>
  </xsl:template>

【讨论】:

以上是关于XSLT 3.0 - 无法在 XSLT 3.0 xml-to-json() 中获取对象数组的主要内容,如果未能解决你的问题,请参考以下文章

Marklogic xml 转换中的 XSLT 3.0 支持

如何在 Java 应用程序中使用 XSLT 3.0?

BizTalk Server 2016 映射中是不是支持 XSLT 2.0 或 3.0?

BizTalk 2020 XSLT 3.0 - 样式表编译期间报告错误

使用 XSLT 2.0/3.0 使用多个步骤将 CDATA 中的纯文本解析为 html。那里的一部分

XSLT 3.0 中的日期排序