将一个xslt样式表递归应用于子文件夹

将一个xslt样式表递归应用于子文件夹,xslt,Xslt,我的目录结构如下: -TopFolder --ChildFolder1/file.xml --ChildFolder2/file.xml --ChildFolder3/file.xml 我希望导航每个子文件夹,将xslt样式表应用于file.xml,并在每个文件夹中输出“file.html”。我看过collections()和其他一些东西,但我不太确定该采取哪种方法。XSLT2.0是否可以做到这一点 Cheers使用Saxon,您可以将此模板规则添加到样式表中: <xsl:temp

我的目录结构如下:

-TopFolder
 --ChildFolder1/file.xml
 --ChildFolder2/file.xml
 --ChildFolder3/file.xml
我希望导航每个子文件夹,将xslt样式表应用于file.xml,并在每个文件夹中输出“file.html”。我看过collections()和其他一些东西,但我不太确定该采取哪种方法。XSLT2.0是否可以做到这一点


Cheers

使用Saxon,您可以将此模板规则添加到样式表中:

<xsl:template name="main">
  <xsl:for-each select="collection('.?select=*.xml;recurse=yes')">
    <xsl:result-document href="out/{tokenize(document-uri(.), '/')[last()]">
      <xsl:apply-templates select="."/>
    </xsl:result-document>
  </xsl:for-each>
</xsl:template>


然后调用它提供-it:main而不是源文档。当然,您可能需要对提供输入和输出目录的方式进行调整。

您不需要XSL 2.0,只需告诉处理器分别在每个XML文件上运行样式表即可。您使用什么命令来运行转换?实际上,我使用的是EclipseXSLT插件,它接受转换参数(我相信这些参数的行为就像您直接从命令行运行一样)。我在想(也许是天真的)我可以使用collections()递归地获取所有xml文件的列表,然后将样式表应用于它们,但这可能有点过分了?如果有一个简单的命令行参数来实现这一点,那就太好了。我应该提到的另一件事是,有超过100个子文件夹,因此需要一种递归处理的方法。我从来没有使用过这种方法,所以我不会有太多帮助,但我确实认为这样做太过分了。如果每个源文档都应该生成一个输出文档,并且它们之间没有交互,那么最好保持样式表的简单,不要同时对多个文档进行操作。您使用的XSLT 2.0处理器是什么?谢谢Michael。我确实尝试过这个方法,但现在出现了一个错误:相对URI的语法无效:索引81处路径中的非法字符:out/file:%20C:%20Users%20me%20workarea%20TopFolder%20ChildFolder1%20 ml[last()]我想知道它是否认为输出路径中有空格,即使没有也没有?好吧,我想,对我来说,尝试构造具有这种效果的代码将是一个有趣的练习,但我可能太离题了。同时,我将把调试留给那些有权访问代码的人。Micheal-谢谢。你给了我足够的时间来理解其余的内容,当然这需要一点定制。@user3653270,Michael,在一些不相关的东西中,我得到了相同的错误消息,而现在Google唯一一个关于“相对URI的无效语法”的点击就是这个线程。你有没有弄清楚是什么引起的?我很困惑,德普,我明白了!意识到生成的字符串包含空白,这是URI字符串不允许的——另请参见。修复方法(无论如何对我来说)是将生成的字符串包装在
encode-for-uri()
中,并将该值用于
xsl:result-document
元素中的
href
属性。干杯