在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) 我需要使用Apache FOP进行XSL转换,我有这样的代码:
//Setup FOP
Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, out);
//Setup Transformer
Source xsltSrc = new StreamSource(new File(xslPath));
Transformer transformer = tFactory.newTransformer(xsltSrc);
//Make sure the XSL transformation's result is piped through to FOP
Result res = new SAXResult(fop.getDefaultHandler());
//Setup input
Source src = new StreamSource(new File(xmlPath));
//Start the transformation and rendering process
transformer.transform(src, res);
Run Code Online (Sandbox Code Playgroud)
这里xslPath
是我的XSLT文件的存储路径.
我已经确认它在我只有一个XSLT文件时有效,但在我的项目中,我将事物分成了几个XSLT文件,并用<xsl:import />
标签加入它们.使用此配置,我得到一个NullPointerException,因为它不了解存储在XSLT中的所有信息,因为它分布在不同的文件上.
我想知道是否有任何方法可以在Source xsltSrc
变量中加载所有这些文件,以便所有XSL信息都可用.
UPDATE
我根据Mads Hansen给出的答案更改了代码,但它仍然无效.我必须在类路径中包含XSLT slt文件,因此我使用ClassLoader加载XSLT文件.我已经检查过URL在执行时有正确的路径url.toExternalForm()
.这是我的新代码:
ClassLoader cl = this.getClass().getClassLoader();
String systemID = "resources/xslt/myfile.xslt";
InputStream in …
Run Code Online (Sandbox Code Playgroud)