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

时间:2009-03-09 17:29:55

标签: xml xslt file filesystems

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

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

<filelist>
    <file>fileA.xml</file>
    <file>fileB.xml</file>
</filelist>

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

<filelist>
    <file>fileA.xml</file>
    <file>fileB.xml</file>
    <file>fileX.xml</file>
    <file>fileY.xml</file>
    .... <!-- other files -->
</filelist>

是否有XSLT方法可以做到这一点?接受dir根目录的东西,能够通过它中的所有文件进行迭代吗?然后我可以称之为:

<xsl:element name = file >
     <xsl:copy> <!--whatever file name--> <xsl:copy>
</xsl:element>0

[编辑-溶液]

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

我使用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>

4 个答案:

答案 0 :(得分:4)

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

解决问题的三种方法是:

  1. 使用编程语言构建XML,完全忽略了XSLT。这是获得所需结果的最简单方法。
  2. 构建一个接受参数的XSL样式表,将(预先构建的)分隔文件列表放入该参数中,让XSLT处理该字符串并从中生成XML。这也涉及外部处理,基本上这是选项1.,而且你必须编写一个XSL样式表来执行字符串处理(XSL尚未适应的东西)
  3. 使用扩展功能并在XSL中执行目录处理。可以在my answer to this question中找到如何入门的示例。这不是非常便携,因为扩展功能是特定于平台的。
  4. 归结为:

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

    Ergo:不要使用XSL。

答案 1 :(得分:1)

您不能在本机XSLT中执行此操作,但各种实现允许您添加功能扩展。

例如,在C#中,您可以添加用户定义的URN:

 <xsl:stylesheet {snipped the usual xmlns stuff}
    xmlns:user="urn:user" >

然后使用“user”

中的功能
  <xsl:value-of select="user:getdirectory( @mydir )" />

在C#中你将“用户”与C#类联系起来:

 XSLThelper xslthelper      = new XSLThelper( );  // your class here
 xslArgs.AddExtensionObject( "urn:user", xslthelper );

并且您的类定义了“getdirectory”函数:

public class XSLThelper
{
public string getdirectory(System.Xml.XPath.XPathNavigator xml, string strXPath, string strNULL)
{
       //blah
    }
}

这里留下了大量的功课! MSDN Resource

答案 2 :(得分:1)

Q是六岁并回答。只为那些再次降落在这里的人投入2美分。

我需要一个表示目录中文件名的XML文件。我已经用三种方式完成了这项工作:

  1. XSLT 2.0 document()正如其他人在此主题中所指出的那样。当你把所有想要的东西都叫做dom解析器时,缺点就是性能。正如LarsH在OP注释中指出的那样,这仅适用于有效的XML文件。如果递归中有非xml或格式错误的xml文件,则会导致转换崩溃。

  2. 使用命令xmlstarlet ls > filenames.xml

  3. 的工具xmlstarlet
  4. 我制作的原始bash脚本(可以优化):

  5. DIRECTORY=$1
    RESULTFILE=$2
    
    # put the directory listing into a temp file
    # modify the ls command for your needs
    ls -A1 $DIRECTORY > /tmp/zFiles.txt
    
    # remove detritus and wrap the lines in <file> elements
    sed -i -e's/^[^$]*$/   <file filename="&"\/>/' /tmp/zFiles.txt
    
    # build the file
    echo '<?xml version="1.0" encoding="UTF-8"?>' > $RESULTFILE
    echo "<files>" >> $RESULTFILE
    cat /tmp/zFiles.txt >> $RESULTFILE
    echo "</files>" >> $RESULTFILE
    

    我已经使用了bash脚本很长一段时间但现在我只使用xmlstarlet方法。结果starlet文件包含特定的文件属性,例如权限和日期,我发现这很有帮助。

答案 3 :(得分:0)

您应该能够使用document()函数来读取XML文件。我不确定它在各种XSLT引擎上的支持程度如何。

这是显示正在使用的good example

但这并没有解决从目录中读取文件名称的问题。另一个答案提供了一种方法。

相关问题