У меня есть XML-документ, созданный с процессором Jackson JSON в Mule ESB. После преобразования JSON в XML У меня есть этот документ:Jackson JSON XML упрощается с помощью XSLT
<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>
Может быть есть какой-нибудь способ легкого Simplify JSON XML в Mule проще.
Пожалуйста, покажите, что вы пробовали и где вы застряли. Мы не можем просто написать всю задачу для вас: [help/on-topic]. – Abel
"* Этот XML слишком сложный для работы с XPath *« Нет такой вещи: по определению XPath может обрабатывать * любой XML-документ. И XSLT зависит от XPath для выбора узлов во входном документе - поэтому, если Xpath не может справиться с этим, ни XSLT, ни XSLT. - Однако верно, что документ, который вы показываете нам, не может быть обработан вообще, потому что он имеет атрибут в закрывающем теге: ' node class =" org.codehaus.jackson.node.ObjectNode ">'. –
Я добавил XSLT, который я пробовал, но он имеет проблемы с вложенными объектами (без тега 'object'), и я не знаю, как это сделать с массивами. –