多个文件输入?
在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部分。