XSLT сделан именно для этой цели.Вы можете преобразовать любой четко определенный XML-файл в любой другой текстовый формат, включая другую XML-структуру.Получите, например, xsltproc, напишите сценарий, и все готово.
Если вам нужно сначала изучить XSLT, вот хорошая отправная точка: http://www.w3schools.com/xsl/ (в этом руководстве приведены примеры преобразования в XHTML,но вам просто нужно использовать ваши целевые теги XML вместо тегов XHTML ...).
Это может быть хороший сценарий для начала (извините, но у меня нет времени, чтобы дать вам полныйготовый скрипт здесь):
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output method="xml" encoding="utf-8" />
<xsl:template match="/">
<bestand registratienummer="123">
<apply-templates select="//Record"/>
</bestand>
</xsl:template>
<xsl:template match="Record">
<xsl:variable name="nihil" select="FieldValue[@fieldName='rapportage_nihil']/@fieldValue"/>
<!-- add more variable lookups here. you need XPath for that. -->
<rapportage nihil="{$nihil}" periode="{$periode}">
<!-- add more output here -->
</rapportage>
</xsl:template>
</xsl:stylesheet>
Вы можете дать xsltproc эту таблицу стилей и ваш исходный XML-документ, он даст вам ваш новый XML-файл.Возможно, вам нужно убедиться, что ваш исходный XML-файл четко определен, то есть содержит один корневой элемент.Ваш пример не выглядит так, как будто он есть, вам может понадобиться заключить его в произвольный элемент.
Чтобы немного рассказать о XSLT и сценарии: представьте, что у вас есть два указателя.Один в сценарии XSLT, другой в вашем исходном XML-файле.XSLT полностью посвящен «применению шаблонов», и он всегда будет использовать шаблон, который является наиболее близким (подумайте о шаблонах как о некоторой функции).
Сначала наиболее близким совпадением будет корневой элемент, поэтому указатель XSLT начинается в шаблоне с match="/"
.Указатель XML находится в корневом элементе (псевдоним «тег») исходного документа XML.Любой элемент, который не , начинающийся с xsl:
, будет считаться выходным элементом.Итак, во-первых, xsltproc выведет элемент <bestand>
.
Затем указатель XSLT идет дальше и находит <apply-templates>
, выбирая все элементы, соответствующие //Record
(двойная косая черта обозначает «на любой глубине»).Для каждого элемента <Record>
он будет «вызывать» соответствующий шаблон.Здесь самым близким совпадением будет <xsl:template match="Record">
.
Таким образом, указатель XSLT будет переходить к шаблону, а указатель XML - к первому <Record>
.Затем объявляется переменная (nihil
), содержащая некоторую информацию из записи, которая выбирается из указателя XML и далее глубже в структуру XML исходного документа с использованием выражения XPath.Выражение XPath говорит: «Выберите из элемента FieldValue
, который имеет атрибут fieldName
со значением 'rapportage_nihil'
значение атрибута fieldValue
» (Думайте об этом как о выражении SQL WHERE для данных XML; Атрибутыздесь с префиксом @
).
Вам необходимо скопировать, вставить и изменить эту строку для каждой информации, которая вам нужна в выходном документе.Затем оценивается выходной элемент <rapportage>
, заменяя каждую переменную (например, {$nihil}
) их соответствующими значениями, установленными выше, на <xsl:variable>
.Вы должны добавить элементы внутри элемента <rapportage>
таким же образом, как элемент <rapportage>
.Тогда шаблон в конце, и следующий <Record>
будет пропущен через шаблон.