多个文件输入?

时间:2008-09-19 14:58:36

标签: xml xslt io

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

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

我正在思考这些问题:

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

6 个答案:

答案 0 :(得分:8)

在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有Directory Generator创建这样的索引。但是不知道你的环境是什么,很难知道推荐什么。

答案 1 :(得分:2)

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

Customizing the XmlUrlResolver Class
The power of XmlResolver

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

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

答案 2 :(得分:0)

我认为XSL不会以这种方式工作:它被设计为在一个或多个文档上被其他东西使用,而其他东西则负责查找应该应用XSLT的文件。

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

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

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

相关问题