Question

Dans un document XSLT, est-il possible de parcourir en boucle un ensemble de fichiers du répertoire en cours?

J'ai parfois un répertoire rempli de fichiers xml qui nécessite une analyse pour générer un rapport. Ma feuille de style fonctionne sur un seul document, mais je voudrais l'étendre sans passer à un autre outil pour fusionner les documents XML.

Je pensais dans le sens suivant:

<xsl:for-each select="{IO Selector Here}">
    <xsl:variable select="document(@url)" name="contents" />
    <!--More stuff here-->
</xsl:for-each>
Était-ce utile?

La solution

Dans XSLT 2.0, et avec Saxon, vous pouvez le faire avec la collection() fonction:

<xsl:for-each select="file:///path/to/directory">
  <!-- process the documents -->
</xsl:for-each>

Voir http: // www. .saxonica.com / documentation / sourcedocs / collections.html pour plus de détails.

Dans XSLT 1.0, vous devez créer un index répertoriant les documents que vous souhaitez traiter avec un outil séparé. Votre environnement peut fournir un tel outil. Par exemple, Cocoon a un générateur de répertoire qui crée un tel index. Mais sans connaître votre environnement, il est difficile de savoir quoi recommander.

Autres conseils

Comme d'autres l'ont dit, vous ne pouvez pas le faire de manière indépendante de la plate-forme. Dans le monde .NET, vous pouvez créer un XmlResolver personnalisé afin que le document ('dir: // c: / foo /') renvoie la liste des fichiers du répertoire 'c: \ foo' dans un format arbitraire de votre choix. Voir les liens suivants pour plus d’informations sur XmlResolver personnalisé:

Personnalisation de la classe XmlUrlResolver
La puissance de XmlResolver

Vous pouvez également recourir à des scripts (tels que le msxsl: script élément) ou des extensions dans votre feuille de style XSLT.

Toutes ces approches rendront votre code XSLT inportable sur d'autres plates-formes.

Je ne pense pas que XSL soit configuré pour fonctionner de cette façon: il est conçu pour être utilisé par quelque chose d'autre sur un ou plusieurs documents, et ce dernier serait responsable de la recherche des fichiers auxquels le XSLT devrait être appliqué.

Si vous aviez un document principal et un jeu fixe de documents justificatifs, vous pourriez éventuellement utiliser le document() fonction pour renvoyer des nœuds et / ou des valeurs spécifiques, mais je soupçonne que votre cas est différent.

À partir de XSLT, je pense que cela ne sera pas possible.

Vous pouvez transmettre tous les noms de fichiers XML à un < xsl: nom de param = " fichiers " / > en tant que liste séparée par des virgules et parcourez-la en utilisant récursivité, substring-before () et substring-after ().

J'ai un outil de ligne de commande qui pourrait être utilisé à cet effet. Il utilise le processeur XSLT intégré à Ant (l'outil de génération java) pour traiter les entrées et les transformer en sorties. Serait facile à emballer avec un fichier de commandes pour la boucle.

svn: //donie.homeip.net/public/tools

Si vous utilisez .Net, vous pouvez utiliser XsltExtension pour passer des appels de votre document XSLT aux méthodes de votre classe .net. La méthode peut ensuite renvoyer des ensembles de noeuds à votre XSLT. Votre méthode peut donc gérer la partie IO du fichier.

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