Как повернуть узлы 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.