web-dev-qa-db-fra.com

Diviser XML en plusieurs fichiers avec XSLT

J'ai du mal à m'enrouler autour de XSLT mais j'ai entendu qu'il était possible de diviser un fichier XML en plusieurs fichiers. Fondamentalement, je voudrais copier tous les éléments jusqu'au premier fichier et après le dernier fichier, puis ajouter le contenu du fichier individuel pour chaque fichier de sortie.

Quelqu'un pourrait-il me donner quelques conseils à ce sujet si c'est même possible?

Merci,

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>

SORTIE:

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>
35
Fredrik L

En réponse à votre commentaire sur la réponse de @ Dimitre ...

Tu as écrit,

<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> 

Cela ne correspond pas tout à fait à votre XML, qui a rootelem comme élément le plus externe, et votre commentaire dit root comme élément le plus externe. Vous voulez probablement quelque chose comme ça:

<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> 

Vous pourriez devenir plus chic en essayant d'utiliser <xsl:copy> au lieu des éléments de résultat littéraux pour root et elem, mais cela ne semble pas en valoir la peine à moins qu'ils ne varient.

16
LarsH

Il n'est pas possible dans XSLT 1.0 pur de produire plus d'un fichier de sortie. On pourrait utiliser le <exslt:document> élément d'extension à cet effet.

Dans XSLT 2.0, utilisez le <xsl:result-document> élément.

14
Dimitre Novatchev

Si vous souhaitez utiliser

<xsl:result-document method="xml" href="file_{@id}-output.xml">

à partir d'un appel ANT xslt, vous devez utiliser 2.0., ajoutez simplement ce qui suit dans votre appel ANT:

<classpath location="/home/ap/saxon/saxon8.jar" />

Et spécifiez Version = "2.0" Et profitez du fractionnement de fichiers.

2
millebii