XSLT: Comment obtenir des noms de fichiers à partir d'un certain répertoire?
Est-il une fonction dans XSLT qui peut prend un chemin d'accès au répertoire et rend tous les fichiers qu'il contient??
J'ai un fichier xml se lit maintenant comme ceci
<filelist>
<file>fileA.xml</file>
<file>fileB.xml</file>
</filelist>
Maintenant, il y a le répertoire appelé dir
, a fichiers fileX.xml
, fileY.xml
et un tas d'autres fichiers xml. Je veux ajouter ces fichiers à l'origine du fichier xml, afin que je puisse obtenir:
<filelist>
<file>fileA.xml</file>
<file>fileB.xml</file>
<file>fileX.xml</file>
<file>fileY.xml</file>
.... <!-- other files -->
</filelist>
Est-il d'une transformation XSLT façon de le faire?? quelque chose qui prend en dir de la racine, et est en mesure de itérateur à travers tous les fichiers qu'il contient?? Et puis je pouvais l'appeler quelque chose comme:
<xsl:element name = file >
<xsl:copy> <!--whatever file name--> <xsl:copy>
</xsl:element>0
[Edit]
toutes les réponses ont été très utiles. J'ai fini par trouver une solution externe (en utilisant saxon). J'ai pensé qu'il pourrait être utile pour d'autres personnes à poster ma solution ici, mais il est très spécifique à ma propre situation.
Je utiliser Ant pour construire un java web app et de la nécessité de traduire des fichiers xml avant le déploiement. Donc, j'ai été en utilisant le xslt
tâche de faire le travail par l'ajout de l' "saxon9.jar" dans le classpath. Et dans mon fichier xsl, j'ai juste fait quelque chose comme ceci:
<xsl:for-each select="collection('../dir/?select=*.xml')" >
<xsl:element name='file'>
<xsl:value-of select="tokenize(document-uri(.), '/')[last()]"/>
</xsl:element>
</xsl:for-each>
Merci pour l'affichage de la solution. Vous devriez poster une réponse afin que nous puissions upvote. 🙂
Notez également que la collecte() n'est pas spécifique à Saxon. C'est une partie de XSLT 2.0 en général. Notez également qu'il ne fonctionne que pour les documents XML,... vous ne pouvez pas par exemple obtenir un répertoire de .les fichiers mp3 à l'aide de la collecte().
Bon Q. Heureux de vous coincé à l'original de votre désir de le faire dans XSL quand d'autres ont suggéré que c'est le mauvais outil. Une fois que vous avez compris, il s'est avéré être assez simple.
OriginalL'auteur tomato | 2009-03-09
Vous devez vous connecter pour publier un commentaire.
XSLT n'a rien construit pour cette tâche. XSLT est un langage de transformation - pour la dynamique de sortie que vous avez généralement besoin d'une transformation source qui contient déjà tout (juste sous une forme différente) – vous ne pouvez pas créer XML à partir de rien.
Les trois façons d'aborder le problème sont:
Il se résume à ceci:
Ergo: Ne pas utiliser XSL pour cela.
collection()
fonction (voir édité question).Dans un monde parfait, vous auriez raison, mais malheureusement de nombreux XSLT implémentations de cette journée sont XSLT 1.0.
C'est vrai. Le seul processeur XSLT que je suis conscient de qui implémente XSLT 2.0 / XPath 2.0 (et plus récent) est Saxon, toutes les autres que je ne connais que de mettre en œuvre XSLT 1.0 / XPath 1.0, malheureusement.
Il y a quelques autres que jusqu'à la version 3.0, la situation n'est pas aussi terrible qu'il était de retour quand j'ai écrit cette réponse. Mais souvent, vous vous trouverez vous-même coincé avec 1.0 toujours.
OriginalL'auteur Tomalak
Vous ne pouvez pas le faire en natif XSLT, mais les différentes implémentations vous permettent d'ajouter des extensions à la fonctionnalité.
Par exemple, en C#, vous pouvez ajouter un utilisateur défini URN:
puis utilisez les fonctions au sein de "l'utilisateur"
dans le C# vous associez "utilisateur" pour une classe C#:
et votre classe définit la "getdirectory" fonction:
Hugh quantité de devoirs à gauche ici! MSDN Ressources
OriginalL'auteur Guy
Le Q est de six ans et a répondu. Juste jeter mes 2 cents pour ceux qui débarquent ici.
J'ai besoin d'un fichier XML représentant les noms de fichiers dans un répertoire. Je l'ai fait de trois façons:
XSLT 2.0 document() comme d'autres l'ont souligné dans ce fil. Inconvénient est que les performances qu'il lit le fichier dans le dom parser, quand tout ce que vous voulais vraiment est le nom. Aussi comme LarsH souligné dans l'OP commentaires, cela ne fonctionne qu'avec des fichiers XML valide. Si vous avez un non-xml ou xml mal formé fichier dans la boucle, il bloque le transformer.
L'outil xmlstarlet avec la commande
xmlstarlet ls > filenames.xml
Brut de script bash que j'ai faite (il pourrait être optimisée):
J'avais utilisé le script bash pour un long temps, mais maintenant j'utilise le xmlstarlet méthode exclusivement. Le résultat starlette fichier contient des attributs de fichiers, tels que les autorisations et les dates, j'ai trouvé très utile.
OriginalL'auteur Paulb
Vous devriez être en mesure d'utiliser le document() fonction de lire les fichiers XML. Je ne suis pas sûr de la façon dont il est pris en charge sur les différents moteurs XSLT.
C'est un bon exemple le montrant en cours d'utilisation.
Mais qui ne traite pas le problème de la lecture dans les noms des fichiers à partir du répertoire. L'autre réponse donne un moyen de le faire côté de.
OriginalL'auteur andynormancx