Question

J'ai plusieurs fichiers XML, dont les noms sont stockés dans un autre fichier XML.

Je souhaite utiliser xsl pour produire un résumé de la combinaison des fichiers xml. Je me souviens qu'il y avait un moyen de faire cela avec les extensions msxml (j'utilise msxml).

Je sais que je peux obtenir le contenu de chaque fichier à l'aide de select = "document (nom_fichier)" , mais je ne suis pas sûr de savoir comment combiner tous ces documents en un.

21-oct-08 J'aurais dû mentionner que je souhaite effectuer un traitement ultérieur sur le code XML combiné. Il n'est donc pas suffisant de le sortir simplement de la transformation. Je dois le stocker sous la forme d'un ensemble de noeuds dans une variable.

Était-ce utile?

La solution

Voici un petit exemple de ce que vous pouvez faire:

fichier1.xml:

<foo>
<bar>Text from file1</bar>
</foo>

file2.xml:

<foo>
<bar>Text from file2</bar>
</foo>

index.xml:

<index>
<filename>file1.xml</filename>
<filename>file2.xml</filename>

summary.xsl:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:exsl="http://exslt.org/common"
    extension-element-prefixes="exsl">

  <xsl:variable name="big-doc-rtf">
      <xsl:for-each select="/index/filename">
        <xsl:copy-of select="document(.)"/>
      </xsl:for-each>
  </xsl:variable>

  <xsl:variable name="big-doc" select="exsl:node-set($big-doc-rtf)"/>

  <xsl:template match="/">
    <xsl:element name="summary">
      <xsl:apply-templates select="$big-doc/foo"/>
    </xsl:element>  
  </xsl:template>

  <xsl:template match="foo">
    <xsl:element name="text">
      <xsl:value-of select="bar"/>
    </xsl:element>  
  </xsl:template>

</xsl:stylesheet>

Appliquer la feuille de style à index.xml vous donne:

<?xml version="1.0" encoding="UTF-8"?><summary><text>Text from file1</text><text>Text from file2</text></summary>

L'astuce consiste à charger les différents documents avec la fonction document (fonction d'extension prise en charge par presque tous les processeurs XSLT 1.0), à afficher le contenu dans le cadre d'un corps de variable, puis à convertir la variable en ensemble de nœuds pour la suite. traitement.

Autres conseils

Supposons que les noms de fichiers soient répertoriés dans un fichier comme celui-ci:

<files>
    <file>a.xml</file>
    <file>b.xml</file>
</files>

Vous pouvez ensuite utiliser une feuille de style comme celle-ci dans le fichier ci-dessus:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

    <xsl:template match="/">
        <root>
            <xsl:apply-templates select="files/file"/>                          
        </root>
    </xsl:template>

    <xsl:template match="file">
        <xsl:copy-of select="document(.)"/>
    </xsl:template>
</xsl:stylesheet>

Consultez le document ( ) documentation de la fonction .

Vous pouvez utiliser document () pour charger d'autres documents XML au cours du processus de transformation. Ils sont chargés en tant que jeux de nœuds. Cela signifie que vous devez initialement alimenter le fichier XML contenant les noms de fichier à charger dans le fichier XSLT, puis le prendre à partir de là:

<xsl:copy-of select="document(@href)/"/>

Merci pour toutes les réponses. Voici le courage de la solution que j'utilise avec msxml.

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ms="urn:schemas-microsoft-com:xslt">
  <xsl:output method="xml"/>
  <xsl:template match="/">
    <xsl:variable name="combined">
      <xsl:apply-templates select="files"/>
    </xsl:variable>
    <xsl:copy-of select="ms:node-set($combined)"/>
  </xsl:template>
  <xsl:template match="files">
    <multifile>
      <xsl:apply-templates select="file"/>
    </multifile>
  </xsl:template>
  <xsl:template match="file">
    <xsl:copy-of select="document(@name)"/>
  </xsl:template>
</xsl:stylesheet>

J'essaie maintenant d'améliorer les performances, car chaque fichier mesure environ 8 Mo et la transformation prend beaucoup de temps, mais c'est une autre question.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top