如何使用xslt将json转换为xml为所需的xml格式?

时间:2017-07-12 07:50:41

标签: json xml xslt xpath xsd

这是我最终需要的XML格式..

<cms:MessageHeader>
<cms:MessageType></cms:MessageType>
    <cms:CreatedTimeStamp> </cms:CreatedTimeStamp>
    <cms:MessageIdentification> </cms:MessageIdentification>    
    <cms:PhysicalSender> </cms:PhysicalSender>  
<cms:PhysicalReceiver>  </cms:PhysicalReceiver> 
</cms:MessageHeader>

<cms:Process>
    <cms:Role></cms:Role>
    <cms:Processidentification></cms:Processidentification>
</cms:Process>

<cms:TransactionAcknowledgement>
    <cms:TransactionIdentification></cms:TransactionIdentification> 
    <cms:OriginalTransactionIdentification></cms:OriginalTransactionIdentification>
    <cms:TransactionAcceptance></cms:TransactionAcceptance>
    <cms:ResponseCode></cms:ResponseCode>
    <cms:TransactionAcceptance> </cms:TransactionAcceptance>
</cms:TransactionAcknowledgement>

,输入json为:

{
    "name": "Message",
    "type": "MESSAGE",
    "attributes": [{
        "name": "ExternalMessageType",
        "value": "Acknowledgement"
    },
    {
        "name": "MessageTimestamp",
        "value": "2017-02-10 11:35:07.595"
    },
    {
        "name": "PhysicalSender",
        "value": "8700000000001"
    },
    {
        "name": "JuridicalSender",
        "value": "8700000000001"
    },
    {
        "name": "PhysicalReceiver",
        "value": "8700000000002"
    },
    {
        "name": "JuridicalReceiver",
        "value": "8700000000002"
    }],
    "entities": [{
        "name": "MessageHeader",
        "type": "MESSAGE_HEADER",
        "attributes": [{
            "name": "InternalMessageType",
            "value": "MPT.CRE"
        },
        {
            "name": "InternalMessageID",
            "value": "98b4c97d-9e49-43d0-a631-b7b43b195c18"
        },
        {
            "name": "ConfigVersion",
            "value": "2.1"
        },
        {
            "name": "ProductVersion",
            "value": "2.0"
        },
        {
            "name": "ReceivedTimestamp",
            "value": "2017-02-10 11:35:07.595"
        },
        {
            "name": "PhysicalSenderID",
            "value": "8700000000001"
        },
        {
            "name": "JuridicalSenderID",
            "value": "8700000000001"
        },
        {
            "name": "PhysicalReceiverID",
            "value": "8700000000001"
        },
        {
            "name": "JuridicalReceiverID",
            "value": "8700000000001"
        },
        {
            "name": "TentantCode",
            "value": "TWS"
        },
        {
            "name": "OrganisationUserID",
            "value": "ENDK_OrgUser1@cgi.com"
        },
        {
            "name": "UserIdentityID",
            "value": "f5c981ea-57d6-46d2-9b93-abfbf297b9b1"
        },
        {
            "name": "Channel",
            "value": "B2B"
        },
        {
            "name": "IsSynchronous",
            "value": false
        }]
    },
    {
        "name": "TRANSACTION",
        "type": "TRANSACTION",
        "attributes": [{
            "name": "ExternalTransactionType",
            "value": "AcknowledgmentSuccess"
        },
        {
            "name": "ExternalTransactionID",
            "value": "7a833e75-2e2d-4ab1-94d1-c844b8e6aa0b"
        }],
        "entities": [{
            "name": "TransactionHeader",
            "type": "TransactionHeader",
            "attributes": [{
                "name": "InternalTransactionType",
                "value": "MHB.ACK.ACC"
            }, {
                "name": "InternalTransactionID",
                "value": "8b4145dc-5c1a-4600-922e-cc90ea3a2a65"
            }]
        },
        {
            "name": "PAYLOAD",
            "type": "PAYLOAD",
            "entities": [{
                "name": "AcceptTransaction",
                "type": "ACCEPT_TRANSACTION",
                "attributes": [{
                    "name": "OriginalExternalMessageID",
                    "value": "8b4145dc-5c1a-46ab-922e-cc90ea3a2a65"
                },
                {
                    "name": "OriginalExternalTransactionID",
                    "value": "8b4145dc-5c1a-46ba-922e-cc90ea3a2a65"
                }]
            },
            {
                "name": "Acceptance",
                "type": "ACCEPTANCE",
                "attributes": [{
                    "name": "SuccessCode",
                    "value": "SC.CPF.000"
                }]
            }]
        }]
    }]
}

2 个答案:

答案 0 :(得分:0)

答案 1 :(得分:0)

一种方法是在XSLT 3.0中使用json-to-xml()函数(例如在Saxon 9.8中),然后将生成的XML转换为所需的格式。

的结果
json-to-xml(unparsed-text('file:///.../test.json'))
输入开始

<map xmlns="http://www.w3.org/2005/xpath-functions">
   <string key="name">Message</string>
   <string key="type">MESSAGE</string>
   <array key="attributes">
      <map>
         <string key="name">ExternalMessageType</string>
         <string key="value">Acknowledgement</string>
      </map>
      <map>
         <string key="name">MessageTimestamp</string>
         <string key="value">2017-02-10 11:35:07.595</string>
      </map>
      <map>
         <string key="name">PhysicalSender</string>
         <string key="value">8700000000001</string>
      </map>

您可以使用通用规则(例如

)对其进行转换
<xsl:template match="fn:map[*[@key='name'][. castable as xs:NCName] and *[@key='value']">
  <xsl:element name="{*[@key='name']}">{*[@key='value']}</xsl:element>
</xsl:template>

或使用更专业的规则,例如

<xsl:template match="fn:map[*[@key='name'][.='MessageTimeStamp']]">
  <time value="{xs:dateTime(translate(*[@key='value'], ' ', 'T'))}"/>
</xsl:template>