0

我有一个 XML 文件,其中包含硬编码的元素名称,例如 FIRST_NAME、LAST_NAME 等。

<employee>
  <EMP_NO>1234</EMP_NO>
  <FIRST_NAME>Bob</FIRST_NAME>
  <SOMETHING_ELSE>Weakly mapped</SOMETHING_ELSE>
  <SOME_OTHER_VALUE>Also weakly mapped</SOME_OTHER_VALUE>
  <LAST_NAME>Smith</LAST_NAME>
</employee>

我追求的输出是

<employee>
  <number>123</number>
  <values>
    <value>
      <name>FIRST_NAME</name>
      <value>Bob</value>
    </value>
    <value>
      <name>LAST_NAME</name>
      <value>Smith</value>
    </value>
    <value>
      <name>SOMETHING_ELSE</name>
      <value>Weakly mapped</value>
    </value>
    <value>
      <name>SOME_OTHER_VALUE</name>
      <value>Also weakly mapped</value>
    </value>
  </value>
</employee>

其中一些节点是预期的,emp_nofirst_namelast_name,我将为这些节点创建从 XML 源到 XML dest 的显式映射以匹配输入。

我接下来需要实现的是每个未映射的节点也将项目添加到我的目标 XML。如果有一个新节点进来,那么它也将被添加到目标 XML。

如果这是不可能的,那么我只想快速手动选择节点并将它们转换为项目,否则我将不得不花费数小时在目标中手动添加节点并连接名称(常量)和值源节点。

这就是我现在必须做的事情......

手动方法

显然,对于数百个节点,这将花费我几个小时,而且我有许多文件要为其创建映射,所以我需要几天时间。我真的很想至少能够做这样的事情......

期望的方法

4

1 回答 1

0

可以在 MapForce 中使用自定义的、导入的内联 xsl 模板执行您想要的操作,并对您的范围架构进行轻微修改。在 MapForce 中执行此操作有点 hack,使用手写的 xsl 转换可能更容易和更清洁。

从自定义模板开始(在文件中,例如 custom.xsl):

<xsl:template name="metaItemIterate">
    <xsl:param name="employeeNode"/>
    <xsl:for-each select="$employeeNode/*">
        <xsl:element name="metaItem">
            <xsl:element name="name">
                <xsl:value-of select="local-name(.)"/>
            </xsl:element>
            <xsl:element name="value">
                <xsl:value-of select="."/>
            </xsl:element>
        </xsl:element>
    </xsl:for-each>
</xsl:template>

请注意,此模板生成具有多个子元素的单个元素。您也可以只生成必要的子元素,并相应地链接它们......

然后使用Add/Remove Libraries...按钮(位于库下方)将您的 xsl 文件添加为库。

在范围和域模式之间拖动新函数,并将employee节点连接到employeeNoderesult函数的连接到clientDefinedMetaData

在模式之间使用自定义函数进行映射的示例

请注意,您可能需要将该属性添加mixed="true"到 clientDefinedMetaData 的架构定义中,以允许在其下方生成随机元素。

我通过单击选项卡获得的数据输出Output

从 MapForce 生成的输出示例

此外,如果您无法更改架构定义以允许其下方的混合元素,则可能无法使用 MapForce 以任何其他方式进行此操作。

于 2015-02-03T21:38:34.873 回答