使用 XSLT 转换将 XML 记录转换为 JSON - 数字格式问题

问题描述 投票:0回答:1

我正在开发一个项目,使用存储过程从数据库中获取数据。数据以 XML 格式返回,如下所示:

<record>
      <field name="ID">8f7e-25fbcce2cdc7</field>
      <field name="TRANSACTIONSTATUS">202</field>
      <field name="TRANSAMT">1.90</field>
      <field name="SNDNAME">MR. Jade</field>
      <field name="RECVNAME">MR. Lucas</field>
      <field name="SNDACCTNUMBER">8224002623</field>
      <field name="RECVACCTNUMBER">5666666</field>
</record>

我在 WSO2 EI 中使用 XSLT 转换将此 XML 转换为 JSON 格式。这是我正在使用的 XSLT 代码:

<?xml version="1.0" encoding="UTF-8"?>
<localEntry key="CTDetailsById_Formatter_LE" xmlns="http://ws.apache.org/ns/synapse">
    <xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
        <xsl:output encoding="UTF-8" indent="yes" method="xml" omit-xml-declaration="yes" version="1.0"/>
        <xsl:template match="/">
            <xsl:variable name="ctDetails" select="//*[local-name()='table']/*[local-name()='record']"/>
            <jsonElement>
                <xsl:element name="transactionId">
                    <xsl:value-of select="$ctDetails/*[local-name()='field'][@name='ID']"/>
                </xsl:element>
                <xsl:element name="status">
                    <xsl:variable name="TrnStatus" select="$ctDetails/*[local-name()='field'][@name='TRANSACTIONSTATUS']"/>
                    <xsl:choose>
                        <xsl:when test="$TrnStatus='202'">
                            <xsl:value-of select="'pending'"/>
                        </xsl:when>
                        <xsl:when test="$TrnStatus='204'">
                            <xsl:value-of select="'initiated'"/>
                        </xsl:when>
                        <xsl:when test="$TrnStatus='203'">
                            <xsl:value-of select="'completed'"/>
                        </xsl:when>
                        <xsl:otherwise/>
                    </xsl:choose>
                </xsl:element>
                <xsl:element name="credittrasfer">
                    <xsl:element name="amount">
                        <xsl:value-of select="$ctDetails/*[local-name()='field'][@name='TRANSAMT']"/>
                    </xsl:element>
                    <xsl:element name="sendername">
                        <xsl:value-of select="$ctDetails/*[local-name()='field'][@name='SNDNAME']"/>
                    </xsl:element>
                    <xsl:element name="receivername">
                        <xsl:value-of select="$ctDetails/*[local-name()='field'][@name='RECVNAME']"/>
                    </xsl:element>
                    <xsl:element name="senderacctnumber">
                        <xsl:value-of select="$ctDetails/*[local-name()='field'][@name='SNDACCTNUMBER']"/>
                    </xsl:element>
                    <xsl:element name="receiveracctnumber">
                        <xsl:value-of select="$ctDetails/*[local-name()='field'][@name='RECVACCTNUMBER']"/>
                    </xsl:element>
                </xsl:element>
            </jsonElement>
        </xsl:template>
    </xsl:transform>
</localEntry>

我面临的问题是 JSON 输出中数字的格式。例如,SNDACCTNUMBER 和 RECVACCTNUMBER 字段在 JSON 输出中应该是字符串,但它显示为不带引号的数字。这是我得到的 JSON 输出:

{
    "transactionId": "M20240425101010101MTBOTS06651000849",
    "status": "pending",
    "credittrasfer": {
        "amount": 1.90,
        "sendername": "MR. Jade",
        "receivername": "MR. Lucas",
        "senderacctnumber": 8224002623, // This should be "8224002623"
        "receiveracctnumber": 5666666 // This should be "5666666"
    }
}

我在 XSLT 代码中尝试了不同的方法,将数字格式化为 JSON 输出中的字符串,但到目前为止还没有成功。有人可以指导我如何确保使用 XSLT 将 SNDACCTNUMBER 和 RECVACCTNUMBER 等特定字段格式化为 JSON 输出中的字符串吗?

json xslt wso2-esb jsonresponse wso2-micro-integrator
1个回答
0
投票

这种行为在 wso2 synapse 引擎中是可以接受的。当 XML 到 json 转换发生时,没有信息来决定原始数据类型是数字还是字符串。因此默认情况下,它将数字视为数字。如果您需要根据需要更改 json 消息,请在将消息转换为 json 后使用 JSON Transform Mediator[1]。请注意,此中介器适用于 EI 660 及以上版本。

[1] https://ei.docs.wso2.com/en/latest/micro-integrator/references/mediators/json-Transform-Mediator/

© www.soinside.com 2019 - 2024. All rights reserved.