XSLT Transformer plusieurs fichiers de sous-répertoire
J'ai créé un fichier XSLT permet de transformer un fichier XML unique. Cependant, j'ai plusieurs centaines de répertoires avec plusieurs fichiers xml. Est-il possible de XSLT pour transformer tous ces fichiers. Je suis l'aide de la fonction de collecte pour obtenir une liste de tous les fichiers. Mais, vous ne savez pas comment appliquer la transformation maintenant.
Voici mon exemple de fichier XSLT. Fondamentalement, je veux une boucle sur tous les fichiers xml et d'appliquer le modèle de tableau sur le fichier individuel. La sortie de toutes ces transformations ont besoin d'être dans un seul fichier texte.
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:foo="http://whatever">
<xsl:output method="text" encoding="ISO-8859-1"/>
<xsl:template name="process">
<xsl:variable name="files" select="collection('file:///C:/files/testResults?select=*.xml;recurse=yes')"/>
<xsl:for-each select="$files">
<xsl:if test="(not(contains(document-uri(.), 'SuiteSetUp'))) and (not(contains(document-uri(.), 'SuiteTearDown')))">
<xsl:value-of select="tokenize(document-uri(.), '/')[last()]"></xsl:value-of>
<xsl:apply-templates select="/testResults/result/tables/table[14]">
<xsl:with-param name="title" select="/testResults/rootPath"></xsl:with-param>
</xsl:apply-templates>
<xsl:apply-templates select="/testResults/result/tables/table[15]"/>
</xsl:if>
</xsl:for-each>
</xsl:template>
<xsl:template match="table">
<xsl:param name="testName"></xsl:param>
<xsl:for-each select="row">
<xsl:if test="position() > 2">
<xsl:variable name="choices" select="col[2]"></xsl:variable>
<xsl:if test="contains($choices, 'fail')">
<xsl:value-of select="$testName"></xsl:value-of>
<xsl:text>|</xsl:text>
<xsl:value-of select="col[1]"></xsl:value-of>
<xsl:text>|</xsl:text>
<xsl:value-of select="foo:getCorrectChoices(col[2])"></xsl:value-of>
<xsl:text>|</xsl:text>
<xsl:value-of select="foo:getExpectedChoices(col[2])"></xsl:value-of>
<xsl:text>|</xsl:text>
<xsl:call-template name="NewLine"/>
</xsl:if>
</xsl:if>
</xsl:for-each>
</xsl:template>
<xsl:template name="NewLine">
<xsl:text>
</xsl:text>
</xsl:template>
<xsl:function name="foo:getCorrectChoices">
<xsl:param name="content"></xsl:param>
<xsl:analyze-string select="$content" regex="\[(\[.+?\])\] fail">
<xsl:matching-substring>
<xsl:value-of select="regex-group(1)"></xsl:value-of>
</xsl:matching-substring>
</xsl:analyze-string>
</xsl:function>
<xsl:function name="foo:getExpectedChoices">
<xsl:param name="content"></xsl:param>
<xsl:analyze-string select="$content" regex="fail\(expected \[(\[.+?\])\]">
<xsl:matching-substring>
<xsl:value-of select="regex-group(1)"></xsl:value-of>
</xsl:matching-substring>
</xsl:analyze-string>
</xsl:function>
</xsl:stylesheet>
Quel type de processeur XSLT utilisez-vous? Si vous êtes en utilisant Saxon, vous pouvez le faire à partir de la ligne de commande directement. Saxon est capable de transformer des lots de fichiers pour lesquels vous voulez appliquer la même transformation.
J'ai été en utilisant un XSLT de l'éditeur appelé EditX pour construire mon XSLT et de la pensée, peut-être que je peux l'exécuter à partir de là. Mais on dirait que j'ai besoin de l'exécuter à partir de quelque part d'autre. J'ai vu une tâche ant pour XSLT. Ce travail?
Quel système d'exploitation êtes-vous sur?
J'ai été en utilisant un XSLT de l'éditeur appelé EditX pour construire mon XSLT et de la pensée, peut-être que je peux l'exécuter à partir de là. Mais on dirait que j'ai besoin de l'exécuter à partir de quelque part d'autre. J'ai vu une tâche ant pour XSLT. Ce travail?
Quel système d'exploitation êtes-vous sur?
OriginalL'auteur user320587 | 2011-05-25
Vous devez vous connecter pour publier un commentaire.
Ici est probablement l'exemple le plus simple de savoir comment traiter tous les fichiers xml dans un système de fichiers sous-arbre (à l'aide de la
collection()
de la fonction en tant que mis en œuvre dans le Saxon):Lorsqu'il est appliqué sur n'importe quel document XML (pas utilisé, ignoré), cette transformation s'applique à l'identité de la règle à chaque document XML figurant dans le
*.xml
fichiers dans leC:/Temp
de la sous-arborescence du système de fichiers.À ne plus neaningful de traitement, on doit remplacer le modèle d'identité -- dans le
inFile
mode.Dans votre cas particulier, je crois que vous pouvez simplement remplacer:
avec
et cela s'applique souhaité modèles sur les nœuds sélectionnés le courant (document) nœud.
Oui, les moteurs XSLT qui viennent avec .NET ne prennent pas en charge XSLT 2.0. La question est de savoir comment ce faire de XSLT 2.0 -- comme l'fournis par les OP le code suggère. Vous pouvez l'installer et l'utiliser Saxon.NET et puis cette transformation se produisent les résultats attendus.
OriginalL'auteur Dimitre Novatchev
Je voulais juste ajouter une version légère de Dimitre excellente réponse. Si vous avez
<foo>
documents (nœud racine) assis dans un répertoire, et d'un programme XSLT pour<foo>
, il suffit de faire votre premier niveau du modèle comme ceci:C'est en supposant que vous voulez l'URL en paramètre,
<xsl:param name="my_url"/>
, spécifié sur la ligne de commande.OriginalL'auteur Pete