我们有来自 Source 的传入 JSON 数据,其中的数据和列位于相同的有效负载中。在 XSLT 中使用 json-to-xml 我能够生成如下 XML:
<?xml version="1.0" encoding="UTF-8"?>
<map xmlns="http://www.w3.org/2005/xpath-functions">
<boolean key="allData">true</boolean>
<map key="factMap">
<map key="T!T">
<array key="rows">
<map>
<array key="dataCells">
<map>
<string key="label">1A</string>
<string key="value">1A</string>
</map>
<map>
<string key="label">1B</string>
<string key="value">1B</string>
</map>
<map>
<string key="label">1C</string>
<string key="value">1C</string>
</map>
</array>
</map>
<map>
<array key="dataCells">
<map>
<string key="label">2A</string>
<string key="value">2A</string>
</map>
<map>
<string key="label">2B</string>
<string key="value">2B</string>
</map>
<map>
<string key="label">2C</string>
<string key="value">2C</string>
</map>
</array>
</map>
<map>
<array key="dataCells">
<map>
<string key="label">3A</string>
<string key="value">3A</string>
</map>
<map>
<string key="label">3B</string>
<string key="value">3B</string>
</map>
<map>
<string key="label">3C</string>
<string key="value">3C</string>
</map>
</array>
</map>
</array>
</map>
</map>
<map key="detailColumnInfo">
<map key="Product_vod__c.F1">
<string key="dataType">string</string>
<string key="label">F1</string>
</map>
<map key="Product_vod__c.F2">
<string key="dataType">string</string>
<string key="label">F2</string>
</map>
<map key="Product_vod__c.F3">
<string key="dataType">string</string>
<string key="label">F3</string>
</map>
</map>
</map>
在这里,每一行都可以在 dataCells 标签下作为标签和值使用。dataCells 下的值代表字段的值,但标签不代表字段名称。字段名称和字段顺序是 detailColumnInfo 标记的一部分。字段/数据的顺序和数量不固定,但目标 XML 应保持固定。例如,传入数据可以有 10 个字段,并且数据可以按任何顺序排列,但是目标 XML 应该只有 2 个字段。为了实现这一点,我相信在运行时我们必须弄清楚 F1 字段的顺序,并且必须从 dataCells 中选择相应的数据。例如,如果 F1 是字段是 detailColumnInfo 中的第一个字段,那么我必须从所有数据单元(1A、2A、3A)中选择第一个值并生成具有 F1 字段值的目标 XML,依此类推。
Detailcolumninfo 标记表示列的详细信息。Detailcolumninfo 中值字段的位置将决定 Datacells 中字段的位置。对于查询中发布的输入代码片段,如果 F1 是 Detailcolumninfo 中的第一个标签,则 Datacells (1A,2A,3A) 中的第一个值表示 F1 的值。类似地,1B、2B、3B 代表 F2 的值。目标 XML 应如下所示:
<Root>
<Rows>
<Row>
<F1> 1A </F1>
<F2> 1B </F2>
<F3> 1C </F3>
</Row>
<Row>
<F1>2A </F1>
<F2> 2B </F2>
<F3> 2C </F3>
</Row>
<Row>
<F1>3A </F1>
<F2> 3B </F2>
<F3> 3C </F3>
</Row>
</Rows>
任何人都可以提出可能的解决方案来实现这种动态映射。