2015-02-01 8 views
0

У меня есть файл XML, который имеет жестко закодированные имена элементов, таких как FIRST_NAME, LAST_NAME и т.д.Как переместить узлы XML в строки 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_no, first_name и last_name и я создам явное сопоставление из источника XML в XML dest для этих узлов, чтобы они соответствовали вводу.

Что нужно для достижения следующего - для каждого неотображаемого узла также добавить элементы в мой целевой XML. Если появится новый узел, он также будет добавлен в целевой XML.

Если это невозможно, я просто хотел бы быстро выбрать узлы и преобразовать их в элементы, иначе мне придется тратить часы, вручную добавляя узлы в цель и проводя имя (постоянная) и значение из исходного узла.

Это та вещь, я, имеющий теперь делать ...

Manual approach

Очевидно, что для сотен узлов это собирается взять меня часов, и у меня есть несколько файлов для создания для меня это займет несколько дней. Я бы очень хотел, по крайней мере, чтобы быть в состоянии сделать что-то вроде этого ...

Desired approach

ответ

0

можно делать то, что вы хотите в MapForce с обычаем, импортируемого шаблона рядный XSL и небольшой модификации к вашей схеме диапазона. Это немного взломать это в 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.

example of mapping with custom function between schemas

Примечание Вы можете добавить атрибут mixed="true" к определению схемы для clientDefinedMetaData для того, чтобы обеспечить генерацию случайных элементов под ним.

Выход я с вашими данными из нажав Output вкладки:

example of output as generated from MapForce

Кроме того, если вы не можете изменить определение схемы, чтобы смешанные элементы под ним, это, вероятно, не это можно сделать другим способом с помощью MapForce.

+0

Если вам нужно выбрать определенные элементы, вы можете добавить этот код к вызываемому шаблону, например. если узел имеет значение, сгенерируйте элемент. –

Смежные вопросы