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>
关键步骤说明
- JSON转XML:利用
json-to-xml()把输入JSON转换成XSLT可操作的XML节点结构。 - 解析内嵌XML:通过
parse-xml()将thirtyMinCallReqFlg中的XML字符串转为XML节点,normalize-space()清理字符串首尾的空白,避免解析错误。 - 循环映射:用
<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
相关产品推荐
相关产品推荐

