Разделение XML на несколько файлов с помощью XSLT
Я с трудом нахожусь в XSLT, но слышал, что можно разбить XML-файл на несколько файлов. По сути, я хотел бы скопировать все элементы до первого файла и после последнего файла, а затем добавить содержимое отдельного файла для каждого выходного файла.
Может ли кто-нибудь дать мне несколько советов по этому вопросу, если это вообще возможно?
Спасибо,
complete.xml
<rootelem>
<elem>
<file attr1='1'>
<content>content file 1</content>
</file>
<file attr2='2'>
<content>content file 2</content>
</file>
<file attr3='3'>
<content>content file 3</content>
</file>
</elem>
</rootelem>
ВЫХОД:
complete_PART1.xml
<rootelem>
<elem>
<file attr1='1'>
<content>content file 1</content>
</file>
</elem>
</rootelem>
complete_PART2.xml
<rootelem>
<elem>
<file attr2='2'>
<content>content file 2</content>
</file>
</elem>
</rootelem>
complete_PART3.xml
<rootelem>
<elem>
<file attr3='3'>
<content>content file 3</content>
</file>
</elem>
</rootelem>
3 ответа
Отвечая на ваш комментарий к ответу @Dimitre...
Вы написали,
<xsl:template match="/">
<xsl:for-each select="elem/file">
<xsl:result-document method="xml" href="file_{@id}-output.xml">
<xsl:copy-of select="."/>
</xsl:result-document>
</xsl:for-each>
</xsl:template>
Это не совсем соответствует вашему XML, который имеет rootelem
в качестве внешнего элемента, и ваш комментарий говорит root
как самый внешний элемент. Вы, вероятно, хотите что-то вроде этого:
<xsl:template match="/root">
<xsl:for-each select="elem/file">
<xsl:result-document method="xml" href="file_{@id}-output.xml">
<root>
<xsl:copy-of select="/root/@*" />
<elem>
<xsl:copy-of select="../@* | ." />
</elem>
</root>
</xsl:result-document>
</xsl:for-each>
</xsl:template>
Вы могли бы полюбить, пытаясь использовать <xsl:copy>
вместо буквальных элементов результата для root и elem, но это не стоит усилий, если они не изменятся.
В чистом XSLT 1.0 невозможно создать более одного выходного файла. Можно использовать <exslt:document>
элемент расширения для этой цели.
В XSLT 2.0 используйте <xsl:result-document>
элемент.
Если вы хотите использовать
<xsl:result-document method="xml" href="file_{@id}-output.xml">
от вызова ANT xslt вам нужно использовать 2.0., просто добавьте следующее в свой вызов ANT:
<classpath location="/home/ap/saxon/saxon8.jar" />
И укажите Version="2.0" И наслаждайтесь разделением файлов.