views:

31

answers:

1

I'm trying to use ant to use XSLT to preprocess three specific stylesheets in my project. The Ant documentation for the xslt task says that it should be able to accept any resource collection. Specifically, it says:

Use resource collections to specify resources that the stylesheet should be applied to. Use a nested mapper and the task's destdir attribute to specify the output files.

I've therefore tried to specify these stylesheets using a fileset, and use the fileset as a nested element in the xslt task, but so far this hasn't been working. Instead, what it will do is seemingly ignore the specified fileset, and scan the entire project for files ending in .xsl, apply the stylesheet to those, and name the output according to the logic specified in the mapper.

<fileset id="stylesheets-to-preprocess" dir="${basedir}">
    <filename name="src/xslt/backends/js/StatePatternStatechartGenerator.xsl"/>
    <filename name="src/xslt/backends/js/StateTableStatechartGenerator.xsl"/>
    <filename name="src/xslt/backends/js/SwitchyardStatechartGenerator.xsl"/>
</fileset>

<!-- ... -->

<target name="preprocess-stylesheets" depends="init">

    <xslt 
        classpathref="xslt-processor-classpath" 
        style="src/xslt/util/preprocess_import.xsl" 
        destdir="build"
        scanincludeddirectories="false">

        <fileset refid="stylesheets-to-preprocess"/>
        <mapper>
            <chainedmapper>
                <flattenmapper/>
                <globmapper from="*.xsl" to="*_combined.xsl"/>
            </chainedmapper>
        </mapper>
    </xslt>

</target>

What I'd like is to restrict it so that only those files specified in the fileset are processed.

Removing the mapper, so that the fileset is the only nested element, will result in ant attempting to apply the transformation to every file, even those without xsl extensions, which inevitably fails when it tries to transform a non-xml document.

I'm using ant 1.7.1. Any guidance would be appreciated.

+2  A: 

Your problem is being caused by the implicit fileset functionality. In order to use a nested fileset parameter you need to switch this feature off.

I'd also recommend using an "include" parameter within the fileset, much simpler, and avoids the need for a complicated mapper element (You must specify the extension of the generated files, otherwise it'll default to .html)

<target name="preprocess-stylesheets" depends="init">

    <xslt 
        classpathref="xslt-processor-classpath" 
        style="src/xslt/util/preprocess_import.xsl" 
        destdir="build"
        extension=".xsl"
        useImplicitFileset="false"
        >

        <fileset dir="src/xslt/backends">
            <include name="StatePatternStatechartGenerator.xsl"/>
            <include name="StateTableStatechartGenerator.xsl"/>
            <include name="SwitchyardStatechartGenerator.xsl"/>
        </fileset>
    </xslt>

</target>
Mark O'Connor