XSLT中是否有一个函数可以接收目录路径并返回其中的所有文件?
我有一个xml文件现在读起来像这样
<filelist>
<file>fileA.xml</file>
<file>fileB.xml</file>
</filelist>
现在,有一个名为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>
是否有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>
答案 0 :(得分:4)
XSLT没有为此任务内置任何内容。 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文件。我已经用三种方式完成了这项工作:
XSLT 2.0 document()正如其他人在此主题中所指出的那样。当你把所有想要的东西都叫做dom解析器时,缺点就是性能。正如LarsH在OP注释中指出的那样,这仅适用于有效的XML文件。如果递归中有非xml或格式错误的xml文件,则会导致转换崩溃。
使用命令xmlstarlet ls > filenames.xml
我制作的原始bash脚本(可以优化):
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。
但这并没有解决从目录中读取文件名称的问题。另一个答案提供了一种方法。