如何在ant中指定要用资源集合进行转换的xml文档?

时间:2010-08-21 03:55:00

标签: java ant xslt

我正在尝试使用ant来使用XSLT在我的项目中预处理三个特定的样式表。 Ant documentation for the xslt task表示它应该能够接受任何资源收集。具体来说,它说:

  

使用资源集合指定应该应用样式表的资源。使用嵌套映射器和任务的destdir属性来指定输出文件。

因此,我尝试使用文件集指定这些样式表,并将文件集用作xslt任务中的嵌套元素,但到目前为止,这还没有起作用。相反,它将做的似乎是忽略指定的文件集,并扫描整个项目以查找以.xsl结尾的文件,将样式表应用于这些文件集,并根据映射器中指定的逻辑命名输出。

<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>

我想要的是限制它,以便只处理文件集中指定的那些文件。

删除映射器,以便文件集是唯一的嵌套元素,将导致ant尝试将转换应用于每个文件,即使没有xsl扩展名的文件,在尝试转换非xml文档时也不可避免地失败。

我正在使用ant 1.7.1。任何指导都将不胜感激。

1 个答案:

答案 0 :(得分:2)

您的问题是由隐式文件集功能引起的。要使用嵌套文件集参数,您需要关闭此功能。

我还建议在文件集中使用“include”参数,这要简单得多,并且不需要复杂的mapper元素(必须指定生成文件的扩展名,否则默认为.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>