Разделение XML на несколько файлов с помощью XSLT - PullRequest
33 голосов
/ 27 октября 2010

Я с трудом нахожусь в 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 ]

15 голосов
/ 28 октября 2010

Отвечая на ваш комментарий к ответу @ 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, но это не стоит усилий, если онибудет меняться.

13 голосов
/ 27 октября 2010

В чистом XSLT 1.0 невозможно создать более одного выходного файла.Для этой цели можно использовать элемент расширения <exslt:document>.

В XSLT 2.0 использовать элемент <xsl:result-document>.

2 голосов
/ 18 января 2011

Если вы хотите использовать

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...