0

FIRST_NAME、LAST_NAME などの要素名がハードコーディングされた XML ファイルがあります。

<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_name、およびlast_nameが予期されます。これらのノードが入力と一致するように、XML ソースから XML dest への明示的なマッピングを作成します。

次に達成する必要があるのは、マップされていないすべてのノードがターゲット XML に項目を追加することです。新しいノードが入ってくると、ターゲット XML にも追加されます。

これが不可能な場合は、ノードを手動で選択してアイテムに変換する簡単な方法が欲しいです。それ以外の場合は、ターゲットに手動でノードを追加し、名前 (定数) と値を接続するのに何時間も費やす必要があります。ソースノード。

これは私が今しなければならないことのようなものです...

手動アプローチ

何百ものノードの場合、これには明らかに数時間かかります。また、マッピングを作成するファイルが多数あるため、数日かかります。せめてこんなことができたらいいのに…。

望ましいアプローチ

4

1 に答える 1

0

カスタムのインポートされたインライン xsl テンプレートを使用して、範囲スキーマをわずかに変更することで、MapForce で必要なことを行うことができます。MapForce でこれを行うのは少しハックですが、代わりに手書きの 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ノードを にemployeeNode接続しresult、関数の を に接続しますclientDefinedMetaData

スキーマ間のカスタム関数によるマッピングの例

mixed="true"その下にランダムな要素を生成できるようにするために、 clientDefinedMetaData のスキーマ定義に属性を追加する必要がある場合があることに注意してください。

Outputタブをクリックして得たデータの出力:

MapForce から生成された出力の例

また、スキーマ定義を変更して、その下にある混合要素を許可できない場合、MapForce を使用して他の方法でこれを行うことはおそらく不可能です。

于 2015-02-03T21:38:34.873 に答える