Как повернуть узлы XML в строки XML?

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

Далее мне нужно, чтобы каждый не отображенный узел также добавил элементы в мой целевой XML. Если появится новый узел, он также будет добавлен в целевой XML.

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

Это то, что я должен сделать сейчас...

Ручной подход

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

Желаемый подход

1 ответ

В 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>

Обратите внимание, что этот шаблон генерирует один элемент с несколькими дочерними элементами. В качестве альтернативы вы можете просто сгенерировать необходимые дочерние элементы и связать их соответственно...

Затем используйте кнопку " Добавить / удалить библиотеки..." (находится под библиотеками), чтобы добавить файл xsl в качестве библиотеки.

Перетащите новую функцию между схемами диапазона и домена и подключите employee узел к employeeNode и result функции для clientDefinedMetaData,

пример сопоставления с пользовательской функцией между схемами

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

Вывод, который я получаю с вашими данными, нажав вкладку Вывод:

пример вывода, сгенерированного из MapForce

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

Другие вопросы по тегам