需要通用xslt for XML to JSONX

时间:2012-10-17 09:59:37

标签: xslt xslt-1.0 jsonx

  

可能重复:
  convert xml to jsonx using xslt

任何人都可以帮我解决下面的数组..我必须生成通用的xsl .. 输入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>

输出:

<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>

我正在使用下面的xslt和输出但不是上面的预期。可以请任何人帮助我。

<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 个答案:

答案 0 :(得分:1)

可能你是说组应该是一个数组,而Group应该是一个对象而不是相反?

试试这个......

<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>

...输出就是这个......

<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>

更新

为了响应OP的更新要求,这是一个新的解决方案。

<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>

输出是......

<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>