XSLT - 需要帮助才能转换成模糊的JSON格式

时间:2015-01-13 11:01:55

标签: xml xslt xpath sap abap

我有一个要求,我想将内部表数据转换为JSON格式。

假设我的内部表名是ZEMPLOYEE,其中的字段是EMPID,ENAME,ESAL。 普通调用转换会将其转换为以下格式。

  

数据 - [{EMPID:101,ENAME:'ABCD',ESAL:100},{EMPID:102,ENAME:'EFGH',ESAL:200},{EMPID:103,ENAME:'IJKL',ESAL :300}]

但我的要求是输出格式应如下所示:

  

数据 - [{EMPID,ENAME,ESAL},{101,ABCD,100},{102,EFGH,200},{103,IJKL,300}] ......

第一个花括号将包含我的表格的字段,其余花括号包含实际数据。

有人可以帮助我使用XSLT转换或简单转换来实现上述输出吗?

1 个答案:

答案 0 :(得分:0)

您向我们展示的内容更接近于CSV而非JSON。尝试类似:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="UTF-8"/>

<xsl:template match="/*">
    <!-- header -->
    <xsl:text>Data-[{</xsl:text>
    <xsl:for-each select="*[1]/*">
        <xsl:value-of select="local-name()"/>
        <xsl:if test="position()!=last()">
            <xsl:text>,</xsl:text>
        </xsl:if>
    </xsl:for-each>
    <xsl:text>},</xsl:text>

    <!-- data -->
    <xsl:for-each select="*">
        <xsl:text>{</xsl:text>
        <xsl:for-each select="*">
            <xsl:value-of select="."/>
            <xsl:if test="position()!=last()">
                <xsl:text>,</xsl:text>
            </xsl:if>
        </xsl:for-each>
        <xsl:text>}</xsl:text>
        <xsl:if test="position()!=last()">
            <xsl:text>,</xsl:text>
        </xsl:if>
    </xsl:for-each>
    <xsl:text>]</xsl:text>
</xsl:template>

</xsl:stylesheet>

当应用于格式正确(!)输入示例时:

<FLIGHT_TABLE>
  <ZSCARR_LINE>
    <CARRID>AA</CARRID>
    <CARRNAME>American Airlines</CARRNAME>
    <CURRCODE>USD</CURRCODE>
  </ZSCARR_LINE>
  <ZSCARR_LINE>
    <CARRID>AB</CARRID>
    <CARRNAME>Air Berlin</CARRNAME>
    <CURRCODE>EUR</CURRCODE>
  </ZSCARR_LINE>
  <ZSCARR_LINE>
    <CARRID>AC</CARRID>
    <CARRNAME>Air Canada</CARRNAME>
    <CURRCODE>CAD</CURRCODE>
  </ZSCARR_LINE>
  <ZSCARR_LINE>
    <CARRID>AF</CARRID>
    <CARRNAME>Air France</CARRNAME>
    <CURRCODE>EUR</CURRCODE>
  </ZSCARR_LINE>
</FLIGHT_TABLE>

结果将是:

Data-[{CARRID,CARRNAME,CURRCODE},{AA,American Airlines,USD},{AB,Air Berlin,EUR},{AC,Air Canada,CAD},{AF,Air France,EUR}]