如何解决XSLT转换子目录中的多个文件
| 我创建了一个XSLT文件,该文件可以转换单个XML文件。但是,我有数百个带有多个xml文件的目录。 XSLT中是否有一种方法可以转换所有这些文件。我正在使用收集功能来获取所有文件的列表。但是,不确定现在如何应用转换。 这是我的示例XSLT文件。基本上,我想遍历所有xml文件并将模板表应用于单个文件。所有这些转换的输出都必须在一个单一的纯文本文件中。<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>
解决方法
这可能是最简单的示例,说明如何处理文件系统子树中的所有xml文件(使用Saxon中实现的
collection()
函数):
<xsl:stylesheet version=\"2.0\"
xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\"
xmlns:xs=\"http://www.w3.org/2001/XMLSchema\">
<xsl:output omit-xml-declaration=\"yes\" indent=\"yes\"/>
<xsl:template match=\"node()|@*\" mode=\"inFile\">
<xsl:copy>
<xsl:apply-templates mode=\"inFile\" select=\"node()|@*\"/>
</xsl:copy>
</xsl:template>
<xsl:template match=\"/\">
<xsl:apply-templates mode=\"inFile\" select=
\"collection(\'file:///C:/temp?select=*.xml;recurse=yes\')\"/>
</xsl:template>
</xsl:stylesheet>
当应用于任何XML文档(不使用,忽略)时,此转换将身份规则应用于文件系统的“ 4”子树中任何“ 3”文件中包含的每个XML文档。
要进行更巧妙的处理,需要覆盖身份模板-在“ 5”模式下。
对于您的特定情况,我相信您可以简单地替换为:
<xsl:apply-templates select=\"/testResults/result/tables/table[14]\">
与
<xsl:apply-templates select=\"./testResults/result/tables/table[14]\">
并将所需的模板应用于从当前(文档)节点选择的节点上。
,我只是想添加Dimitre出色答案的轻量级版本。如果您在目录中有<foo>
个文档(根节点),以及ѭ8a的有效XSLT程序,则只需使您的顶级模板如下所示:
<xsl:template match=\"/\">
<xsl:apply-templates select=\"collection($my_url)/foo\"/>
</xsl:template>
假设您要在命令行上将URL作为参数<xsl:param name=\"my_url\"/>
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。