Разделение 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>
Ответы
Ответ 1
Отвечая на ваш комментарий в ответ @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, но это не кажется нужным, если они не будут меняться.
Ответ 2
В чистом XSLT 1.0 невозможно создать более одного выходного файла. Для этой цели можно использовать <exslt:document>
.
В XSLT 2.0 используйте элемент <xsl:result-document>
.
Ответ 3
Если вы хотите использовать
<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"
И наслаждайтесь разделом файлов.