2008-09-19 97 views
6

在XSLT文档中,是否可以遍历当前目录中的一组文件?多个文件输入?

我有一个情况,我有一个目录充满xml文件,需要做一些分析来生成报告。我的样式表在单个文档上运行良好,但是我想扩展该样式表而不用另一个工具来合并xml文档。

我是基于这样的思考:

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

回答

8

在XSLT 2.0,并与撒克逊人,你可以用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有一个Directory Generator,它创建了这样一个索引。但不知道你的环境是什么,很难知道推荐什么。

0

我不认为XSL设置为工作方式:它的目的是通过在一个或多个文档别的东西可以使用,而其他的东西将负责查找应该使用XSLT的文件。

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

0

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

您可以将所有XML文件名传递给< xsl:param name =“files”/ >作为逗号分隔列表并使用递归和substring-before()和substring-after()循环。

0

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

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

2

正如其他人所说,你不能以平台无关的方式做到这一点。在.NET世界中,您可以创建一个自定义的XmlResolver,以便文档('dir:// c:/ foo /')以您希望的任意格式返回'c:\ foo'目录中的文件列表。更多信息请参见自定义的XmlResolver的以下链接:

Customizing the XmlUrlResolver Class
The power of XmlResolver

你也可以求助于使用脚本(如msxsl:script元素)或扩展的XSLT样式表。

所有这些方法都会使您的XSLT代码无法移植到其他平台。

0

如果您使用的是.Net,则可以使用XsltExtension从您的XSLT文档调用.NET类中的方法。该方法可以将节点集返回给您的XSLT。所以你的方法可以处理文件IO部分。