【问题标题】:XSLT - Need help for transformation into vaguely JSON-like formatXSLT - 需要帮助才能转换成模糊的类似 JSON 的格式
【发布时间】:2015-03-11 07:37:58
【问题描述】:

我有一个需求,我想将内部表数据转换为 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 转换或简单转换实现上述输出?

【问题讨论】:

  • 请张贴输入的xml以及您尝试过的xslt
  • 嗨 Saurav,这是我的 XML... - - AA 美国航空公司USD - AB柏林航空EUR - AC加拿大航空CAD - AF CARRID> 法航EUR
  • 你从哪里得到这个“101,ABCD,100”数据??
  • 我可能错了,但那是有效(和/或合理)的 JSON 吗?花括号内应该有键值对...
  • @vwegert.. 是的,有效的 JSON 将在键值对中......因为表列不会改变我想将它们保留在第一个花括号中......然后我想要保留数据...以便保存用于存储密钥名称的内存..

标签: json xslt abap


【解决方案1】:

您向我们展示的内容更接近 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}]

【讨论】:

  • 感谢 Michael 的回复。上面的代码根本没有给出输出...这是我的代码数据:lt_table TYPE TABLE OF zscarr_line。数据:xml_string 类型 xstring。从 Scarr 中选择 * 到表 lt_table 的相应字段中。调用转换 zflight SOURCE flight_table = lt_table RESULT XML xml_string。 lref_json_writer = cl_sxml_string_writer=>create( type = if_sxml=>co_xt_json )。调用转换 zkxslt 源 Xml xml_string 结果 Xml xml_string。在 ZKXSLT ID 中,我保留了您发布的代码,但它没有给出输出。
  • @kishorebabu 上面的 XSLT 代码将 XML 输入文档转换为请求的格式 - 请参阅:xsltransform.net/bFDb2C8 如果您在应用程序中启动 XSL 转换时遇到问题,请发布一个单独的问题。 --附言请不要在 cmets 中发布代码 - 改为编辑您的问题..
  • 您提到的上述代码对我有用……但是如何从我们获得的输出中获取原始 XML 文件。我应该遵循哪种方法。
  • @kishorebabu "我应该采用哪种方法。" 我真的不知道。我想任何可以解析 text 并将其输出为 XML 的工具都可以。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-24
相关资源
最近更新 更多