Jackson JSON XML упрощается с помощью XSLT

У меня есть XML-документ, созданный с помощью процессора Jackson JSON в Mule ESB. После преобразования JSON в XML у меня есть этот документ:

<org.mule.module.json.JsonData>
  <node class="org.codehaus.jackson.node.ObjectNode">
    <__nodeFactory/>
    <__children>
      <entry>
        <string>author</string>
        <org.codehaus.jackson.node.ObjectNode>
          <__nodeFactory reference="../../../../__nodeFactory"/>
          <__children>
            <entry>
              <string>application</string>
              <org.codehaus.jackson.node.TextNode>
                <__value>web</__value>
              </org.codehaus.jackson.node.TextNode>
            </entry>
            <entry>
              <string>name</string>
              <org.codehaus.jackson.node.ArrayNode>
                <__nodeFactory reference="../../../../../../../../../../__nodeFactory"/>
                <__children>
                <org.codehaus.jackson.node.ObjectNode>
                  <__nodeFactory reference="../../../../../../../../../../../../__nodeFactory"/>
                  <__children>
                  <entry>
                    <string>name</string>
                    <org.codehaus.jackson.node.TextNode>
                    <__value>Connected</__value>
                    </org.codehaus.jackson.node.TextNode>
                  </entry>
                  <entry>
                    <string>checked</string>
                    <org.codehaus.jackson.node.BooleanNode reference="../../../../../../../../../../entry[11]/org.codehaus.jackson.node.ArrayNode/__children/org.codehaus.jackson.node.ObjectNode/__children/entry[2]/org.codehaus.jackson.node.BooleanNode"/>
                  </entry>
                  <entry>
                    <string>checked_at</string>
                    <org.codehaus.jackson.node.TextNode>
                    <__value>2015-09-10T18:55:58+03:00</__value>
                    </org.codehaus.jackson.node.TextNode>
                  </entry>
                  </__children>
                </org.codehaus.jackson.node.ObjectNode>
                <org.codehaus.jackson.node.TextNode>
                  <__value>Tested</__value>
                </org.codehaus.jackson.node.TextNode>
                <org.codehaus.jackson.node.TextNode>
                  <__value>Tested</__value>
                </org.codehaus.jackson.node.TextNode>
                </__children>
              </org.codehaus.jackson.node.ArrayNode>
            </entry>
          </__children>
        </org.codehaus.jackson.node.ObjectNode>
      </entry>
    </__children>
  </node class="org.codehaus.jackson.node.ObjectNode">
</org.mule.module.json.JsonData>

Этот XML слишком сложен для работы с XPath, и я хочу упростить их с помощью простого XSLT, чтобы получить что-то вроде этого:

<object>
  <entry>
    <key>author</key>
    <value>
      <object>
        <entry>
          <key>application</key>
          <value>web</value>
        </entry>
        <entry>
          <key>name</key>
          <value>
            <array>
              <item>
                <object>
                  <entry>
                    <key>name</key>
                    <value>Connected</value>
                  </entry>
                  <entry>
                    <key>checked</key>
                    <value/>
                  </entry>
                  <entry>
                    <key>checked_at</key>
                    <value>2015-09-10T18:55:58+03:00</value>
                  </entry>
                </object>
              </item>
              <item>Tested</item>
              <item>Tested</item>
            </array>
          </value>
        </entry>
      </object>
    </value>
  </entry>
</object>

Правила следующие:

  1. узел org.codehaus.jackson.node.ObjectNode и node[@class='org.codehaus.jackson.node.ObjectNode'] должен быть преобразован в узел object с дочерними узлами entry.
  2. узел entry для object должен быть преобразован в узел entry с дочерними узлами key и value.
  3. узел org.codehaus.jackson.node.ArrayNode и node[@class='org.codehaus.jackson.node.ArrayNode'] должен быть преобразован в узел array с дочерними узлами item.
  4. все дочерние узлы узла __children для array должны быть преобразованы в item со значением.
  5. другие типы значений должны быть преобразованы как есть.

Я попытался реализовать эту логику с помощью XSLT, но не знаю, как это сделать с вложенными объектами и массивами (вообще):

<xsl:stylesheet version="2.0" xmlns="">
  <xsl:strip-space elements="*" />
  <xsl:output method="xml" indent="yes" />

  <xsl:template match="org.codehaus.jackson.node.ObjectNode | node[@class='org.codehaus.jackson.node.ObjectNode']">
    <object select="__children"><xsl:apply-templates /></>
  </xsl:template>

  <xsl:template match="entry">
    <entry><xsl:apply-templates /></entry>
  </xsl:template>

  <xsl:template match="entry/*[1]">
    <key><xsl:apply-templates /></key>
  </xsl:template>

  <xsl:template match="entry/*[2]">
    <value><xsl:apply-templates /></value>
  </xsl:template>
</xsl:stylesheet>

Может быть, есть способ упростить JSON XML в Mule.


person Nikita Petrov    schedule 12.09.2015    source источник
comment
Покажите, пожалуйста, что вы пробовали и где застряли. Мы не можем просто написать всю задачу за вас: справочный центр.   -  person Abel    schedule 12.09.2015
comment
Этот XML слишком сложен для работы с XPath Такого не существует: по определению XPath может обрабатывать любой XML-документ. И XSLT зависит от XPath для выбора узлов во входном документе, поэтому, если Xpath не может его обработать, XSLT не сможет. - Однако верно, что документ, который вы нам показываете, не может быть обработан вообще, потому что у него есть атрибут закрывающего тега: </node class="org.codehaus.jackson.node.ObjectNode">.   -  person michael.hor257k    schedule 12.09.2015
comment
Я добавил XSLT, который пробовал, но у него проблемы с вложенными объектами (без тега object), и я не знаю, как это правильно делать с массивами.   -  person Nikita Petrov    schedule 14.09.2015


Ответы (1)


Если вы используете версию 3.7. Dataweave - ваш ответ:

https://developer.mulesoft.com/docs/dataweave#_json_to_xml

person Ismael G.    schedule 08.10.2015