【问题标题】:How to convert json to xml using xslt to the required xml format?如何使用 xslt 将 json 转换为 xml 到所需的 xml 格式?
【发布时间】:2017-07-12 07:50:41
【问题描述】:

这是我最终需要的 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"
                }]
            }]
        }]
    }]
}

【问题讨论】:

  • 你试过什么? (Stackoverflow 不是编码服务。)XSLT 3.0 绝对可以做到这一点;您使用的是支持 3.0 的处理器吗?

标签: json xml xslt xpath xsd


【解决方案1】:

【讨论】:

    【解决方案2】:

    一种方法是使用 XSLT 3.0(例如 Saxon 9.8)中的 json-to-xml() 函数,然后将生成的 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>
    

    【讨论】:

      猜你喜欢
      • 2019-07-02
      • 2012-10-12
      • 2021-07-22
      • 1970-01-01
      • 2022-11-30
      • 2020-01-26
      • 2023-03-30
      相关资源
      最近更新 更多