You can tell Ant that you want to use Saxon by specifying it on the classpath attribute of the xslt or style task:
<property name="docbook.home" value="c:/java/docbook-xsl-1.68.1"/> <property name="saxon.dir" value="c:/java/saxon6_5_3"/> <property name="xml.dir" value="xml"/> <property name="fo.dir" value="fo"/> <target name="xslt" depends="clean,init" description="Converts docbook xml to fo"> <xslt style="${docbook.home}/fo/docbook.xsl" classpath="${saxon.dir}/saxon.jar" basedir="${xml.dir}" extension=".fo" destdir="${fo.dir}" /> </target>
E:\java\docbook>ant xslt Buildfile: build.xml xslt: [xslt] Transforming into E:\java\docbook\fo [xslt] Processing E:\java\docbook\xml\anotherbook.xml to E:\java\docbook\fo\anotherbook.fo [xslt] Loading stylesheet C:\java\docbook-xsl-1.68.1\fo\docbook.xsl [xslt] Making portrait pages on USletter paper (8.5inx11in) [xslt] Processing E:\java\docbook\xml\saxonbook.xml to E:\java\docbook\fo\saxonbook.fo [xslt] Making portrait pages on USletter paper (8.5inx11in) BUILD SUCCESSFUL Total time: 24 seconds E:\java\docbook>
Once you [finally] get the .fo file created, use the 'fop' Ant task provided by Apache FOP to do the final transform:
<property name="fop.home" value="c:/java/fop-0.20.5"/> <property name="fo.dir" value="fo"/> <property name="pdf.dir" value="pdf"/> <taskdef name="fop" classname="org.apache.fop.tools.anttasks.Fop"> <classpath> <pathelement location="${fop.home}/build/fop.jar"/> <pathelement location="${fop.home}/lib/avalon-framework-cvs-20020806.jar"/> <pathelement location="${fop.home}/lib/batik.jar"/> </classpath> </taskdef> <!-- This example converts all XSL-FO files within an entire directory to PDF: --> <target name="generate-multiple-pdf" description="Generates multiple PDF files"> <fop format="application/pdf" outdir="${pdf.dir}"> <fileset dir="${fo.dir}"> <include name="*.fo"/> </fileset> </fop> </target> <!-- The following example converts a single XSL-FO file to a PDF document: --> <target name="generate-pdf" description="Generates a single PDF file"> <fop format="application/pdf" fofile="mybook.fo" outfile="mybook.pdf" /> </target>
The xmlto command in Cygwin converts xml to various formats, one of which is pdf. You can use the default stylesheets
$ xmlto fo mybook.xml
or you can tell it what stylesheet to use
$ xmlto -x /path/to/docbook-xsl-1.68.1/fo/docbook.xsl fo mybook.xml
Same thing as the Saxon example above, only with xalan.jar specified instead of saxon.jar
<target name="xalan" depends="clean,init" description="Converts docbook xml to fo"> <xslt style="${docbook.home}/fo/docbook.xsl" classpath="${xalan.dir}/xalan.jar" basedir="${xml.dir}" extension=".fo" destdir="${fo.dir}" /> </target>
If for some reason the xslt (or style) task starts misbehaving, you can use Saxon in a <java> task, as if you were using it from the command line:
See docbook-apps mailing list archives for 2/17/2005: http://lists.oasis-open.org/archives/docbook-apps/200502/msg00122.html
Command Line Saxon: http://saxon.sourceforge.net/saxon6.5.3/using-xsl.html#Command-line
<property name="docbook.home" value="c:/java/docbook-xsl-1.68.1"/> <property name="input.xml.file" value="newbook.xml"/> <property name="output.fo.file" value="newbook.fo"/> <property name="saxon.dir" value="c:/java/saxon6_5_3"/> <path id="saxon.classpath"> <pathelement location="${saxon.dir}/saxon.jar"/> </path> <target name="saxon" description="Converts docbook xml to fo"> <java classpathref="saxon.classpath" classname="com.icl.saxon.StyleSheet" fork="yes" dir="."> <arg line="-o ${output.fo.file}"/> <arg line="${input.xml.file}"/> <arg line="${docbook.home}/fo/docbook.xsl"/> </java> </target>
With JDK 1.5.0_01 and Xalan 2.6.0, if you see this:
U:\java\docbook>ant xslt-multiple Buildfile: build.xml xslt-multiple: [xslt] Transforming into U:\java\docbook [xslt] Processing U:\java\docbook\mybook.xml to U:\java\docbook\mybook.fo [xslt] Loading stylesheet C:\java\docbook-xsl-1.68.1\fo\docbook.xsl BUILD FAILED java.lang.ExceptionInInitializerError Total time: 5 seconds U:\java\docbook>
Try this:
JDK 1.5 uses Xalan XSLTC by default, which cannot handle the current docbook stylesheets
<property name="docs.src" value="."/> <property name="docs.dest" value="."/> <property name="docbook.home" value="c:/java/docbook-xsl-1.68.1"/> <!-- An attempt to convert docbook xml to fo using Ant --> <target name="xslt-multiple" description="Converts docbook xml to fo"> <xslt style="${docbook.home}/fo/docbook.xsl" destdir="." extension=".fo" includes="*.xml" force="true" /> </target>
$ ant xslt Buildfile: build.xml xslt: [style] Transforming into U:\java\docbook [style] Processing U:\java\docbook\build.xml to U:\java\docbook\build.fo [style] Loading stylesheet C:\java\docbook-xsl-1.68.1\fo\docbook.xsl [style] : Error! file:/C:/java/docbook-xsl-1.68.1/fo/formal.xsl: line 493: Attribute 'border-left-style' outside of element. [style] : Error! file:/C:/java/docbook-xsl-1.68.1/fo/formal.xsl: line 494: Attribute 'border-right-style' outside of element. [style] : Error! file:/C:/java/docbook-xsl-1.68.1/fo/formal.xsl: line 495: Attribute 'border-top-style' outside of element. [style] : Error! file:/C:/java/docbook-xsl-1.68.1/fo/formal.xsl: line 496: Attribute 'border-bottom-style' outside of element. [style] : Error! The first argument to the non-static Java function 'dayAbbreviation' is not a valid object reference. [style] : Error! Cannot convert data-type 'void' to 'reference'. [style] : Fatal Error! Could not compile stylesheet [style] Failed to process U:\java\docbook\build.xml BUILD FAILED U:\java\docbook\build.xml:32: Fatal error during transformation Total time: 7 seconds wsmoak@A2000018 /cygdrive/u/java/docbook $
Wendy Smoak wsmoak@gmail.com