Need General xslt for XML to JSONX [duplicate]

柔情痞子 提交于 2019-12-11 11:19:36

问题


Possible Duplicate:
convert xml to jsonx using xslt

Can anyone help me out in getting the below with an array..I have to generate the generalised xsl.. Input XML:

<accounts>
    <displayOrdinal>0</displayOrdinal>
    <name>String</name>
    <account>
        <accountNumber>String</accountNumber>
        <name>String</name>
        <balance>
            <balanceAmount>0.0</balanceAmount>
        </balance>
        <balance>
            <balanceAmount>0.0</balanceAmount>
        </balance>
        <properties>
            <displayOrdinal>0</displayOrdinal>
        </properties>
        <properties>
            <displayOrdinal>0</displayOrdinal>
        </properties>
        <usage>
            <type>String</type>
        </usage>
        <usage>
            <type>String</type>
        </usage>
    </account>
    <account>
        <accountNumber>String</accountNumber>
        <name>String</name>
        <balance>
            <balanceAmount>0.0</balanceAmount>
        </balance>
        <balance>
            <balanceAmount>0.0</balanceAmount>
        </balance>
        <properties>
            <displayOrdinal>0</displayOrdinal>
        </properties>
        <properties>
            <displayOrdinal>0</displayOrdinal>
        </properties>
        <usage>
            <type>String</type>
        </usage>
        <usage>
            <type>String</type>
        </usage>
    </account>
</accounts>

Output:

<json:object xmlns:json="http://www.ibm.com/xmlns/prod/2009/jsonx">
    <json:object name="accounts">
        <json:string name="displayOrdinal">0</json:string>
        <json:string name="name">String</json:string>
        <json:array name="account">
            <json:object>
                <json:string name="accountNumber">String</json:string>
                <json:string name="name">String</json:string>
                <json:array name="balance">
                    <json:object>
                        <json:string name="balanceAmount">0.0</json:string>
                    </json:object>
                    <json:object>
                        <json:string name="balanceAmount">0.0</json:string>
                    </json:object>
                </json:array>
                <json:array name="properties">
                    <json:object>
                        <json:string name="displayOrdinal">0</json:string>
                    </json:object>
                    <json:object>
                        <json:string name="displayOrdinal">0</json:string>
                    </json:object>
                </json:array>
                <json:array name="usage">
                    <json:object>
                        <json:string name="type">String</json:string>
                    </json:object>
                    <json:object name="usage">
                        <json:string name="type">String</json:string>
                    </json:object>
                </json:array>
            </json:object>
            <json:object>
                <json:string name="accountNumber">String</json:string>
                <json:string name="name">String</json:string>
                <json:object name="balance">
                    <json:string name="balanceAmount">0.0</json:string>
                </json:object>
                <json:array name="balance">
                    <json:object>
                        <json:string name="balanceAmount">0.0</json:string>
                    </json:object>
                    <json:object>
                        <json:string name="displayOrdinal">0</json:string>
                    </json:object>
                    <json:object>
                        <json:string name="displayOrdinal">0</json:string>
                    </json:object>
                </json:array>
                <json:array name="usage">
                    <json:object>
                        <json:string name="type">String</json:string>
                    </json:object>
                    <json:object>
                        <json:string name="type">String</json:string>
                    </json:object>
                </json:array>
            </json:object>
        </json:array>
    </json:object>
</json:object>

I am using the below xslt and output but not as expected above.Could any one please help me.

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:json="http://www.ibm.com/xmlns/prod/2009/jsonx">
        <xsl:output method="xml" indent="yes" encoding="UTF-8" omit-xml-declaration="yes"/>
        <xsl:strip-space elements="*"/>
        <!-- Array -->
        <xsl:template match="*[*[2]][name(*[1])=name(*[2])]">
            <json:object name="{name()}">
                <json:array name="{name(*[1])}">
                    <xsl:apply-templates/>
                </json:array>
            </json:object>
        </xsl:template>
        <!-- Array member -->
        <xsl:template match="*[parent::*[ name(*[1])=name(*[2]) ]] | /">
            <json:object>
                <xsl:apply-templates/>
            </json:object>
        </xsl:template>
        <!-- Object -->
        <xsl:template match="*">
            <json:object name="{name()}">
                <xsl:apply-templates/>
            </json:object>
        </xsl:template>
        <!-- String -->
        <xsl:template match="*[not(*)]">
            <json:string name="{name()}">
                <xsl:value-of select="."/>
            </json:string>
        </xsl:template>
    </xsl:stylesheet>

回答1:


May be you meant to say that Groups should be an array and Group should be an object instead of the other way around?

Try this...

<xsl:stylesheet version="2.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  xmlns:json="http://www.ibm.com/xmlns/prod/2009/jsonx"
  exclude-result-prefixes="xsl xs">
<xsl:output indent="yes" encoding="UTF-8" omit-xml-declaration="yes" />
<xsl:strip-space elements="*" /> 

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

<!-- Array -->
<xsl:template match="*[*[2]][name(*[1])=name(*[2])]">
  <json:array name="{name()}">
    <xsl:apply-templates />
  </json:array>
</xsl:template>

<!-- Object -->  
<xsl:template match="*">
  <json:object name="{name()}">
    <xsl:apply-templates />
  </json:object>
</xsl:template>

<!-- String -->
<xsl:template match="*[not(*)]">
  <json:string name="{name()}">
    <xsl:value-of select="." />
  </json:string>
</xsl:template>
</xsl:stylesheet>

...the output is this...

<json:object xmlns:json="http://www.ibm.com/xmlns/prod/2009/jsonx">
   <json:object name="Login">
      <json:array name="Groups">
         <json:object name="Group">
            <json:string name="Name">john</json:string>
            <json:string name="Password"/>
         </json:object>
         <json:object name="Group">
            <json:string name="Name">john</json:string>
            <json:string name="Password"/>
         </json:object>
      </json:array>
   </json:object>
</json:object>

Update

In response to the OP's updated requirements, here is a new solution.

<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:json="http://www.ibm.com/xmlns/prod/2009/jsonx">
<xsl:output indent="yes" encoding="UTF-8" omit-xml-declaration="yes" />
<xsl:strip-space elements="*" /> 

<!-- Array -->
<xsl:template match="*[*[2]][name(*[1])=name(*[2])]">
  <json:object name="{name()}">
    <json:array name="{name(*[1])}">
      <xsl:apply-templates />
    </json:array>
  </json:object>
</xsl:template>

<!-- Array member -->  
<xsl:template match="*[parent::*[ name(*[1])=name(*[2]) ]] | /">
  <json:object>
    <xsl:apply-templates />
  </json:object>
</xsl:template>

<!-- Object -->  
<xsl:template match="*">
  <json:object name="{name()}">
    <xsl:apply-templates />
  </json:object>
</xsl:template>

<!-- String -->
<xsl:template match="*[not(*)]">
  <json:string name="{name()}">
    <xsl:value-of select="." />
  </json:string>
</xsl:template>
</xsl:stylesheet>

Output is so...

<json:object xmlns:json="http://www.ibm.com/xmlns/prod/2009/jsonx">
  <json:object name="Login">
    <json:object name="Groups">
      <json:array name="Group">
        <json:object>
          <json:string name="Name">john</json:string>
          <json:string name="Password"></json:string>
        </json:object>
        <json:object>
          <json:string name="Name">john</json:string>
          <json:string name="Password"></json:string>
        </json:object>
      </json:array>
    </json:object>
  </json:object>
</json:object>


来源:https://stackoverflow.com/questions/12931751/need-general-xslt-for-xml-to-jsonx

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!