多个文件输入?

时间:2020-03-06 14:26:21  来源:igfitidea点击:

在XSLT文档中,是否可以循环遍历当前目录中的一组文件?

我遇到的情况是我的目录中充满了xml文件,需要进行一些分析才能生成报告。我的样式表可以在单个文档上运行,但是我想扩展它而不用使用其他工具来合并xml文档。

我在沿着这些思路思考:

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

解决方案

我不认为XSL可以那样工作:它被设计用于一个或者多个文档中的其他内容,而其他内容将负责查找应将XSLT应用到的文件。

如果我们有一个主文档和一组固定的支持文档,则可以使用document()函数返回特定的节点和/或者值,但是我怀疑情况有所不同。

在XSLT内部,我认为这是不可能的。

我们可以将所有XML文件名作为逗号分隔的列表传递给<xsl:param name =" files" />,并使用递归和substring-before()和substring-after()在其上循环。

我有一个可用于此目的的命令行工具,它使用Ant中内置的XSLT处理器(java构建工具)来处理输入+转换为输出。使用批处理文件进行循环包装将很容易。

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

在XSLT 2.0和Saxon中,可以使用collection()函数来做到这一点:

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

有关更多详细信息,请参见http://www.saxonica.com/documentation/sourcedocs/collections.html。

在XSLT 1.0中,我们必须创建一个索引,该索引列出了要使用单独工具处理的文档。环境可能提供了这样的工具;例如,Cocoon具有创建此类索引的目录生成器。但是,如果不知道环境是什么,很难知道该推荐什么。

正如其他人所说,我们不能以与平台无关的方式来执行此操作。在.NET世界中,我们可以创建一个自定义XmlResolver,以便document('dir:// c:/ foo /')以我们希望的任意格式返回'c:\ foo'目录中的文件列表。有关自定义XmlResolver的更多信息,请参见以下链接:

自定义XmlUrlResolver类
XmlResolver的力量

我们也可以在XSLT样式表中使用脚本(例如msxsl:script元素)或者扩展名。

所有这些方法将使XSLT代码无法移植到其他平台。

如果使用的是.Net,则可以使用XsltExtension来从XSLT文档调用.net类中的方法。然后,该方法可以将节点集返回到XSLT。因此,方法可以处理文件IO部分。