6

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

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

我是这样想的:

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

6 回答 6

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 有一个创建此类索引的目录生成器。但是如果不知道你的环境是什么,就很难知道推荐什么。

于 2008-09-19T19:22:52.797 回答
2

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

自定义 XmlUrlResolver 类
XmlResolver 的强大功能

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

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

于 2008-09-19T19:23:59.423 回答
0

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

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

于 2008-09-19T15:33:53.860 回答
0

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

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

于 2008-09-19T16:10:20.747 回答
0

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

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

于 2008-09-19T16:14:30.410 回答
0

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

于 2008-09-22T14:38:19.633 回答