使用XSLT将XML转JSON:账号数字格式化为字符串问题求助
解决WSO2 EI中XSLT转换JSON时账号字段转为字符串的问题
问题原因
WSO2 EI的JSON转换器会自动识别XML元素中的数值内容,将其解析为JSON数字类型(不带引号)。但账号这类字段应作为字符串处理,因此需要强制转换器将特定字段视为字符串。
解决方案
在XSLT中使用WSO2提供的json:force-string属性,为需要转为字符串的元素添加该属性并设置为true。具体修改如下:
修改后的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" xmlns:json="http://wso2.org/projects/esb/json"> <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:attribute name="json:force-string">true</xsl:attribute> <xsl:value-of select="$ctDetails/*[local-name()='field'][@name='SNDACCTNUMBER']"/> </xsl:element> <xsl:element name="receiveracctnumber"> <xsl:attribute name="json:force-string">true</xsl:attribute> <xsl:value-of select="$ctDetails/*[local-name()='field'][@name='RECVACCTNUMBER']"/> </xsl:element> </xsl:element> </jsonElement> </xsl:template> </xsl:transform> </localEntry>
关键修改点
- 引入
http://wso2.org/projects/esb/json命名空间,前缀为json。 - 在
senderacctnumber和receiveracctnumber元素中添加json:force-string="true"属性,强制JSON转换器将这些元素的内容视为字符串。
修正后的JSON输出
{ "transactionId": "M20240425101010101MTBOTS06651000849", "status": "pending", "credittrasfer": { "amount": 1.90, "sendername": "MR. Jade", "receivername": "MR. Lucas", "senderacctnumber": "8224002623", "receiveracctnumber": "5666666" } }
内容的提问来源于stack exchange,提问作者Oshada Eranga
相关产品推荐
相关产品推荐

