代码之家  ›  专栏  ›  技术社区  ›  Josh Bush

多个文件输入?

  •  6
  • Josh Bush  · 技术社区  · 16 年前

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

    在这种情况下,我有一个包含XML文件的目录,需要做一些分析来生成一个报告。我的样式表可以在单个文档上运行,但是我希望在不使用其他工具合并XML文档的情况下扩展它。

    我一直在想:

    <xsl:for-each select="{IO Selector Here}">
        <xsl:variable select="document(@url)" name="contents" />
        <!--More stuff here-->
    </xsl:for-each>
    
    6 回复  |  直到 16 年前
        1
  •  8
  •   Richard    16 年前

    在XSLT2.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 了解更多详细信息。

    在XSLT1.0中,必须创建一个索引,列出要使用单独工具处理的文档。您的环境可能提供这样的工具;例如,cocoon有一个 Directory Generator 这就产生了这样一个索引。但是不知道你的环境是什么,很难知道推荐什么。

        2
  •  2
  •   Antosha    16 年前

    正如其他人所说,您不能以平台独立的方式来完成这项工作。在.NET世界中,您可以创建一个自定义的xmlvolver,这样文档(“dir://c:/foo/”)将以您希望的任意格式返回“c:\foo”目录中的文件列表。有关自定义XML冲突解决程序的详细信息,请参阅以下链接:

    Customizing the XmlUrlResolver Class
    The power of XmlResolver

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

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

        3
  •  0
  •   Dave DuPlantis    16 年前

    我不认为XSL是这样设置的:它被设计成在一个或多个文档上被其他人使用,而其他人则负责查找应用XSLT的文件。

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

        4
  •  0
  •   Tomalak    16 年前

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

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

        5
  •  0
  •   SteveDonie    16 年前

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

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

        6
  •  0
  •   Simon Keep    16 年前

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