2015-09-12 3 views
0

У меня есть 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> 

В Правилах находятся рядом:

  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> 

Может быть есть какой-нибудь способ легкого Simplify JSON XML в Mule проще.

+0

Пожалуйста, покажите, что вы пробовали и где вы застряли. Мы не можем просто написать всю задачу для вас: [help/on-topic]. – Abel

+1

"* Этот XML слишком сложный для работы с XPath *« Нет такой вещи: по определению XPath может обрабатывать * любой XML-документ. И XSLT зависит от XPath для выбора узлов во входном документе - поэтому, если Xpath не может справиться с этим, ни XSLT, ни XSLT. - Однако верно, что документ, который вы показываете нам, не может быть обработан вообще, потому что он имеет атрибут в закрывающем теге: ''. –

+0

Я добавил XSLT, который я пробовал, но он имеет проблемы с вложенными объектами (без тега 'object'), и я не знаю, как это сделать с массивами. –

ответ

Смежные вопросы