情况如下。 转换的输出必须基于文件集中文件的数量和名称。 文件集如下所示:
<fileset dir="lpf-version-34.0/" casesensitive="yes">
<include name="*/*-uniques.xml"/>
</fileset>
假设我在这个文件集中有三个文件:
LPF-版本34.0 / 1 / TOD-uniques.xml
LPF-版本34.0 / 2 / TOD-uniques.xml
LPF-版本34.0 / 3 / TOD-uniques.xml
我想以某种方式将这些文件传递给xsl
文件(例如参数),这样我就可以生成这样的输出:
<files>
<file path="lpf-version-34.0/1/tod-uniques.xml"/>
<file path="lpf-version-34.0/2/tod-uniques.xml"/>
<file path="lpf-version-34.0/3/tod-uniques.xml"/>
</files>
答案 0 :(得分:0)
您可以使用pathconvert任务来连接文件集的所有文件并将其存储到属性中。之后,您可以将该属性作为参数传递给xsl样式表并在xsl中处理它。下面是构建要传递给xsl的参数的示例:
<fileset dir="lpf-version-34.0/" casesensitive="yes" id="lpf-files.id">
<include name="*/*-uniques.xml"/>
</fileset>
<pathconvert pathsep="," property="lpflist" refid="lpf-files.id"/>
<xslt in="somefile.xml" style="style.xsl" out="result.xml">
<param name="files" expression="${lpflist}"/>
</xslt>
当然,它假设您的xsl文件(该示例中为style.xsl)正确定义并处理参数files
。
答案 1 :(得分:0)
在以下解决方案中:
<script>
任务使用JavaScript从<fileset>
生成XML。saxon:parse
函数将XML字符串转换为适当的XML节点。Saxon-B是一个XSLT处理器,它有一个名为saxon:parse的便捷函数:
[saxon:parse]接受一个参数,一个包含格式良好的XML文档的源文本的字符串。它返回解析此文本产生的文档节点(根节点)。
要使用Saxon-B,请从http://saxon.sourceforge.net/下载saxonb9-1-0-8j.zip。从下载的Zip文件中将saxon9.jar解压缩到包含build.xml文件的目录中。
<?xml version="1.0"?>
<theRoot/>
<project name="ant-xslt-call-with-xml-param" default="run" basedir=".">
<target name="run">
<!-- The fileset needs an "id" so the JavaScript can find it. -->
<!-- -->
<!-- Note: "dir" was "lpf-version-34.0" in the question. -->
<!-- The JavaScript is simpler with "lpf-version-34.0" in the <include>. -->
<fileset id="my-fileset" dir="${basedir}" casesensitive="yes">
<include name="lpf-version-34.0/*/*-uniques.xml"/>
</fileset>
<script language="javascript">
<![CDATA[
// A bunch of XML infrastructure boilerplate.
var docFactory = javax.xml.parsers.DocumentBuilderFactory.newInstance();
var docBuilder = docFactory.newDocumentBuilder();
var tFactory = javax.xml.transform.TransformerFactory.newInstance();
var transformer = tFactory.newTransformer();
transformer.setOutputProperty(
javax.xml.transform.OutputKeys.OMIT_XML_DECLARATION, "yes");
var writer = new java.io.StringWriter();
var doc = docBuilder.newDocument();
var filesElement = doc.createElement("files");
doc.appendChild(filesElement);
var fileSet = project.getReference( "my-fileset" );
var ds = fileSet.getDirectoryScanner( project );
var includes = ds.getIncludedFiles();
for ( var i = 0; i < includes.length; i++ )
{
var filename = includes[i]
var singleFileElement = doc.createElement("file");
singleFileElement.appendChild(doc.createTextNode(filename));
filesElement.appendChild(singleFileElement);
}
transformer.transform(
new javax.xml.transform.dom.DOMSource(doc),
new javax.xml.transform.stream.StreamResult(writer));
var outputXml = writer.getBuffer().toString();
project.setProperty( "fileset-xml", outputXml );
]]>
</script>
<xslt style="transform.xsl" in="in.xml" out="out.xml">
<classpath location="saxon9.jar"/>
<factory name="net.sf.saxon.TransformerFactoryImpl"/>
<param name="fileset-xml" expression="${fileset-xml}"/>
</xslt>
</target>
</project>
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:saxon="http://saxon.sf.net/"
>
<xsl:output method="xml" indent="yes" />
<xsl:param name="fileset-xml"/>
<xsl:template match="/theRoot">
<xsl:copy>
<xsl:copy-of select="saxon:parse($fileset-xml)"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
<?xml version="1.0" encoding="UTF-8"?>
<theRoot>
<files>
<file>lpf-version-34.0\1\tod-uniques.xml</file>
<file>lpf-version-34.0\2\tod-uniques.xml</file>
<file>lpf-version-34.0\3\tod-uniques.xml</file>
</files>
</theRoot>