Преобразование массива JSON в XML с использованием XSLT - PullRequest
0 голосов
/ 25 июня 2018

У меня есть страница переднего плана, которая отправляет запрос службе данных, развернутой на консоли wso2 для выполнения обновления в таблице.Проблема в том, что мне нужно преобразовать массив json из внешнего интерфейса в формат xml для создания фабрики полезной нагрузки для запроса.JSON:

{"cdcList":
["UpdateCdc":
    {
 "idCdc":1,
     "order":1,
     "cdcName":"test 1",
    },
 "UpdateCdc":
    {
     "idCdc":2,
 "order":2,
     "cdcName":"test 2",
     "idParent":1
    },
  "UpdateCdc":
    {
     "idCdc":3,
     "order":1,
     "cdcName":"test 3",
     "idParent":1
     }
]

}

и желаемый результат в xml, который я хотел бы получить:

<cdcList>
          <UpdateCdc>
        <idCdc>1</idCdc>
        <order>1</order>
            <cdcName>test 1</cdcName>
          </UpdateCdc>
          <UpdateCdc>
            <idCdc>2</idCdc>
            <order>2</order>
            <cdcName>test 2</cdcName>
            <idParent>1</idParent>
          </UpdateCdc>
          <UpdateCdc>
            <idCdc>3</idCdc>
            <order>3</order>
            <cdcName>test 3</cdcName>
            <idParent>1</idParent>
          </UpdateCdc>
</cdcList>

Спасибо.

Ответы [ 2 ]

0 голосов
/ 26 июня 2018

Хотя ответ Майкла Кея дает вам XML (см. Его в Интернете по адресу https://xsltfiddle.liberty -development.net / bFDb2Cf / ), я думаю, что у него есть один недостаток, порядок ключей карты XPath 3.1не определено, поэтому с map:keys вы можете получить любой заказ для дочерних элементов (например, в связанном примере это idParent, idCdc, cdcName, order), в то время как вы, вероятно, захотите определить порядок длядочерние элементы на основе порядка в JSON.Это может быть достигнуто с помощью функции json-to-xml, уже упомянутой Тимом в комментарии:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:fn="http://www.w3.org/2005/xpath-functions"
    xmlns:math="http://www.w3.org/2005/xpath-functions/math"
    xmlns:map="http://www.w3.org/2005/xpath-functions/map"
    xmlns:array="http://www.w3.org/2005/xpath-functions/array"
    exclude-result-prefixes="xs math map array fn"
    version="3.0">

  <xsl:output method="xml" indent="yes"/>

  <xsl:param name="json-input" as="xs:string">[
    {
        "idCdc": 1,
        "order": 1,
        "cdcName": "test 1"
    },
    {
        "idCdc": 2,
        "order": 2,
        "cdcName": "test 2",
        "idParent": 1
    },
    {
        "idCdc": 3,
        "order": 1,
        "cdcName": "test 3",
        "idParent": 1
    }
]</xsl:param>

  <xsl:variable name="json-array" select="parse-json($json-input)"/>

  <xsl:variable name="json-xml" select="json-to-xml($json-input)"/>

  <xsl:template match="/">
    <cdcList>
        <xsl:apply-templates select="$json-xml/*"/>
    </cdcList>
  </xsl:template>

  <xsl:template match="fn:map">
      <updateCdc>
          <xsl:apply-templates/>
      </updateCdc>
  </xsl:template>

  <xsl:template match="fn:map/fn:*">
      <xsl:element name="{@key}">
          <xsl:value-of select="."/>
      </xsl:element>
  </xsl:template>

</xsl:stylesheet>

https://xsltfiddle.liberty -development.net / bFDb2Cf / 2 имеет такой пример в https://xsltfiddle.liberty -development.net / bFDb2Cf / 1 Я также вывожу результат вызова json-to-xml, чтобы вы могли видеть, как вход JSON отображается в XML:

<array xmlns="http://www.w3.org/2005/xpath-functions">
   <map>
      <number key="idCdc">1</number>
      <number key="order">1</number>
      <string key="cdcName">test 1</string>
   </map>
   <map>
      <number key="idCdc">2</number>
      <number key="order">2</number>
      <string key="cdcName">test 2</string>
      <number key="idParent">1</number>
   </map>
   <map>
      <number key="idCdc">3</number>
      <number key="order">1</number>
      <string key="cdcName">test 3</string>
      <number key="idParent">1</number>
   </map>
</array>
0 голосов
/ 25 июня 2018

Чтобы выполнить обработку на стороне клиента в XSLT с поддержкой синтаксического анализа JSON, вам потребуется процессор XSLT 3.0, что на практике означает Saxon-JS. (Отказ от ответственности: это продукт моей компании.)

К сожалению, введенные вами данные не являются допустимыми JSON, но давайте предположим, что на самом деле это так:

[
    {
        "idCdc": 1,
        "order": 1,
        "cdcName": "test 1"
    },
    {
        "idCdc": 2,
        "order": 2,
        "cdcName": "test 2",
        "idParent": 1
    },
    {
        "idCdc": 3,
        "order": 1,
        "cdcName": "test 3",
        "idParent": 1
    }
]

Затем вы можете преобразовать его в желаемый формат XML, используя следующий код XSLT 3.0:

<xsl:variable name="json-array" select="json-doc('input.json')"/>
<cdcList>
  <xsl:for-each select="$json-array?*">
    <updateCdc>
      <xsl:for-each select="map:keys(.)">
         <xsl:element name="{.}">
           <xsl:value-of select="map:get(.)"/>
         </xsl:element>
      </xsl:for-each>
    </updateCdc>
  </xsl:for-each>
</cdcList>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...