Разделение 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" И наслаждайтесь разделением файлов.

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