У меня есть 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>
Правила следующие:
- узел
org.codehaus.jackson.node.ObjectNode
иnode[@class='org.codehaus.jackson.node.ObjectNode']
должен быть преобразован в узелobject
с дочерними узламиentry
. - узел
entry
дляobject
должен быть преобразован в узелentry
с дочерними узламиkey
иvalue
. - узел
org.codehaus.jackson.node.ArrayNode
иnode[@class='org.codehaus.jackson.node.ArrayNode']
должен быть преобразован в узелarray
с дочерними узламиitem
. - все дочерние узлы узла
__children
дляarray
должны быть преобразованы вitem
со значением. - другие типы значений должны быть преобразованы как есть.
Я попытался реализовать эту логику с помощью 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.
</node class="org.codehaus.jackson.node.ObjectNode">
. - person michael.hor257k   schedule 12.09.2015object
), и я не знаю, как это правильно делать с массивами. - person Nikita Petrov   schedule 14.09.2015