XSLT:如何从某个目录中获取文件名?

tom*_*ato 15 xml filesystems xslt file

在XSLT中是否有一个函数可以接受目录路径并返回其中的所有文件?

我有一个xml文件现在读起来像这样

<filelist>
    <file>fileA.xml</file>
    <file>fileB.xml</file>
</filelist>
Run Code Online (Sandbox Code Playgroud)

现在,有一个名为目录dir,有文件fileX.xml,fileY.xml和一堆在它的其他XML文件.我想将这些文件添加到原始xml文件中,以便我可以获得:

<filelist>
    <file>fileA.xml</file>
    <file>fileB.xml</file>
    <file>fileX.xml</file>
    <file>fileY.xml</file>
    .... <!-- other files -->
</filelist>
Run Code Online (Sandbox Code Playgroud)

有没有一种XSLT方法可以做到这一点?接受dir根目录的东西,能够通过其中的所有文件进行迭代吗?然后我可以打电话给:

<xsl:element name = file >
     <xsl:copy> <!--whatever file name--> <xsl:copy>
</xsl:element>0
Run Code Online (Sandbox Code Playgroud)

[编辑-溶液]

所有的答案都非常有帮助.我最终找到了一个外部解决方案(使用撒克逊).我认为其他人在这里发布我的解决方案可能会有所帮助,尽管这对我自己的情况非常具体.

我使用Ant构建一个java Web应用程序,需要在部署之前翻译一些xml文件.因此,我xslt通过在类路径中添加"saxon9.jar"来完成任务.在我的xsl文件中,我只是做了这样的事情:

<xsl:for-each select="collection('../dir/?select=*.xml')" >
     <xsl:element name='file'>
        <xsl:value-of select="tokenize(document-uri(.), '/')[last()]"/>
     </xsl:element>
</xsl:for-each>
Run Code Online (Sandbox Code Playgroud)

Tom*_*lak 4

XSLT 没有内置任何内容来完成此任务。XSLT 是一种转换语言 - 对于动态输出,您通常需要一个包含所有内容(只是形式不同)的转换- 您不能从无到有创建 XML。

解决该问题的三种方法是:

  1. 使用编程语言构建 XML,完全省略 XSLT。这是获得您想要的结果的最简单方法。
  2. 构建一个接受参数的 XSL 样式表,将(预构建的)分隔文件列表放入该参数中,让 XSLT 处理该字符串并从中生成 XML。这也涉及外部处理,基本上这是选项 1。此外,您还必须编写一个执行字符串处理的 XSL 样式表(XSL 尚未适应这一点)
  3. 使用扩展函数并在 XSL 中进行目录处理。如何开始的示例可以在我对此问题的回答中找到。这不是很可移植,因为扩展功能是特定于平台的。

归结起来是这样的:

  • 需要外部编程语言的帮助
  • 您并不绝对需要XSLT 来完成该任务,因为 XML 输出就是您所需要的,并且不需要任何转换。

因此:不要为此使用 XSL。

  • 这不再是正确答案。XPath 2.0 引入了“collection()”函数(请参阅编辑后的问题)。 (2认同)