【问题标题】:Multiple file inputs?多个文件输入?
【发布时间】:2008-09-19 14:58:35
【问题描述】:

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

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

我的想法是这样的:

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

【问题讨论】:

    标签: xml xslt io


    【解决方案1】:

    在 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 来创建这样的索引。但是,如果不知道您的环境是什么,就很难知道该推荐什么。

    【讨论】:

      【解决方案2】:

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

      Customizing the XmlUrlResolver Class
      The power of XmlResolver

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

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          【解决方案4】:

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

          您可以将所有 XML 文件名作为逗号分隔列表传递给 ,并使用递归和 substring-before() 和 substring-after() 对其进行循环。

          【讨论】:

            【解决方案5】:

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

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

            【讨论】:

              【解决方案6】:

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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2011-06-03
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2012-10-25
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多