Подтвердить что ты не робот

Разделение 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>
4b9b3361

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