You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OIC中XSLT提取JSON内嵌XML值并循环映射至目标XML方案咨询

问题描述

在Oracle Integration Cloud(OIC)中使用XSLT处理JSON输入时,需要从JSON的thirtyMinCallReqFlg字段提取内嵌的XML内容,将其中重复的readingDetailsList元素循环映射到符合目标XML Schema的结构中。

输入JSON:

{
   "requestMessage":{
      "contactName":"",
      "primaryPhoneExt":"",
      "secondaryPhoneExt":"",
      "thirtyMinCallReqFlg":"<cmPCReadingDetails><readingDetailsList><readSequence>1</readSequence><readingUOM>1</readingUOM><readingTOU>1</readingTOU><readingSQI>1</readingSQI><meterRegisterTypeCode>KW</meterRegisterTypeCode><numberOfDials>6</numberOfDials><numberOfDecimals>3</numberOfDecimals><upperLimit>0</upperLimit><lowerLimit>41</lowerLimit><reading>41</reading><newReading>40</newReading><override>false</override><measurementCondition>501000</measurementCondition><measurementDescription>Regular</measurementDescription></readingDetailsList><readingDetailsList><readSequence>2</readSequence><readingUOM>1</readingUOM><readingTOU>1</readingTOU><readingSQI>1</readingSQI><meterRegisterTypeCode>KWH</meterRegisterTypeCode><numberOfDials>5</numberOfDials><numberOfDecimals>0</numberOfDecimals><upperLimit>0</upperLimit><lowerLimit>312</lowerLimit><reading>312</reading><newReading>111</newReading><override>false</override><measurementCondition>501000</measurementCondition><measurementDescription>Regular</measurementDescription></readingDetailsList></cmPCReadingDetails> ",
      "contactPersonPhone":""
   }
}

目标XML Schema:

<?xml version="1.0" encoding="windows-1252" ?>
<xsd:schema
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns="http://www.example.org"
            targetNamespace="http://www.example.org" elementFormDefault="qualified">
    <xsd:element name="thirtyMinCallReqFlg">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element name="cmPCReadingDetails">
                    <xsd:complexType>
                        <xsd:sequence>
                            <xsd:element name="readingDetailsList" maxOccurs="unbounded">
                                <xsd:complexType>
                                    <xsd:sequence>
                                        <xsd:element name="readSequence" type="xsd:integer"/>
                                        <xsd:element name="readingUOM" type="xsd:integer"/>
                                        <xsd:element name="readingTOU" type="xsd:integer"/>
                                        <xsd:element name="readingSQI" type="xsd:integer"/>
                                        <xsd:element name="meterRegisterTypeCode" type="xsd:string"/>
                                        <xsd:element name="numberOfDials" type="xsd:integer"/>
                                        <xsd:element name="numberOfDecimals" type="xsd:integer"/>
                                        <xsd:element name="upperLimit" type="xsd:integer"/>
                                        <xsd:element name="lowerLimit" type="xsd:integer"/>
                                        <xsd:element name="reading" type="xsd:integer"/>
                                        <xsd:element name="newReading" type="xsd:integer"/>
                                        <xsd:element name="override" type="xsd:string"/>
                                        <xsd:element name="measurementCondition" type="xsd:integer"/>
                                        <xsd:element name="measurementDescription" type="xsd:string"/>
                                    </xsd:sequence>
                                </xsd:complexType>
                            </xsd:element>
                        </xsd:sequence>
                    </xsd:complexType>
                </xsd:element>
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>
</xsd:schema>
解决方案

核心逻辑是先将JSON转换为XML结构,解析内嵌的XML字符串,再循环映射重复元素到目标Schema。以下是适配OIC的XSLT 3.0代码:

<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:ns="http://www.example.org"
                exclude-result-prefixes="ns">

    <!-- 将输入JSON转为XML结构 -->
    <xsl:param name="json-input" as="node()"/>
    <xsl:variable name="json-xml" select="json-to-xml($json-input)"/>

    <xsl:template match="/">
        <ns:thirtyMinCallReqFlg>
            <ns:cmPCReadingDetails>
                <!-- 解析内嵌XML字符串,去除首尾空白 -->
                <xsl:variable name="embedded-xml" select="parse-xml(normalize-space($json-xml//*[@key='thirtyMinCallReqFlg']))"/>
                
                <!-- 循环处理每个readingDetailsList -->
                <xsl:for-each select="$embedded-xml/cmPCReadingDetails/readingDetailsList">
                    <ns:readingDetailsList>
                        <ns:readSequence><xsl:value-of select="readSequence"/></ns:readSequence>
                        <ns:readingUOM><xsl:value-of select="readingUOM"/></ns:readingUOM>
                        <ns:readingTOU><xsl:value-of select="readingTOU"/></ns:readingTOU>
                        <ns:readingSQI><xsl:value-of select="readingSQI"/></ns:readingSQI>
                        <ns:meterRegisterTypeCode><xsl:value-of select="meterRegisterTypeCode"/></ns:meterRegisterTypeCode>
                        <ns:numberOfDials><xsl:value-of select="numberOfDials"/></ns:numberOfDials>
                        <ns:numberOfDecimals><xsl:value-of select="numberOfDecimals"/></ns:numberOfDecimals>
                        <ns:upperLimit><xsl:value-of select="upperLimit"/></ns:upperLimit>
                        <ns:lowerLimit><xsl:value-of select="lowerLimit"/></ns:lowerLimit>
                        <ns:reading><xsl:value-of select="reading"/></ns:reading>
                        <ns:newReading><xsl:value-of select="newReading"/></ns:newReading>
                        <ns:override><xsl:value-of select="override"/></ns:override>
                        <ns:measurementCondition><xsl:value-of select="measurementCondition"/></ns:measurementCondition>
                        <ns:measurementDescription><xsl:value-of select="measurementDescription"/></ns:measurementDescription>
                    </ns:readingDetailsList>
                </xsl:for-each>
            </ns:cmPCReadingDetails>
        </ns:thirtyMinCallReqFlg>
    </xsl:template>
</xsl:stylesheet>

关键步骤说明

  1. JSON转XML:利用json-to-xml()把输入JSON转换成XSLT可操作的XML节点结构。
  2. 解析内嵌XML:通过parse-xml()将thirtyMinCallReqFlg中的XML字符串转为XML节点,normalize-space()清理字符串首尾的空白,避免解析错误。
  3. 循环映射:用<xsl:for-each>遍历所有readingDetailsList节点,逐个映射到目标Schema的对应元素,注意目标元素必须带上http://www.example.org命名空间。

OIC使用提示

  • 在OIC映射组件中选择「XSLT映射」模式,导入上述代码。
  • OIC默认支持XSLT 3.0,无需额外配置即可使用json-to-xml()和parse-xml()函数。
  • 输出后可通过OIC的Schema验证工具,确认结果符合目标XML结构要求。

内容的提问来源于stack exchange,提问作者Nilesh Jha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 01:01:18