diff --git a/src/etc/testcases/taskdefs/optional/xml/books.xml b/src/etc/testcases/taskdefs/optional/xml/books.xml new file mode 100644 index 000000000..1bfac41ea --- /dev/null +++ b/src/etc/testcases/taskdefs/optional/xml/books.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/src/etc/testcases/taskdefs/optional/xml/stylesheet_include.xsl b/src/etc/testcases/taskdefs/optional/xml/stylesheet_include.xsl new file mode 100644 index 000000000..2f1871d1c --- /dev/null +++ b/src/etc/testcases/taskdefs/optional/xml/stylesheet_include.xsl @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/src/etc/testcases/taskdefs/optional/xml/stylesheet_with_include.xsl b/src/etc/testcases/taskdefs/optional/xml/stylesheet_with_include.xsl new file mode 100644 index 000000000..435994e79 --- /dev/null +++ b/src/etc/testcases/taskdefs/optional/xml/stylesheet_with_include.xsl @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/src/etc/testcases/taskdefs/optional/xslt.xml b/src/etc/testcases/taskdefs/optional/xslt.xml index fd1531b96..34d3ce46f 100644 --- a/src/etc/testcases/taskdefs/optional/xslt.xml +++ b/src/etc/testcases/taskdefs/optional/xslt.xml @@ -79,4 +79,10 @@ style="xml/apache.xsl"> + + + + diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/TraXLiaison.java b/src/main/org/apache/tools/ant/taskdefs/optional/TraXLiaison.java index b1b7dc45b..e5a1df852 100644 --- a/src/main/org/apache/tools/ant/taskdefs/optional/TraXLiaison.java +++ b/src/main/org/apache/tools/ant/taskdefs/optional/TraXLiaison.java @@ -27,6 +27,7 @@ import java.io.InputStream; import java.io.OutputStream; import java.util.Vector; import java.util.Enumeration; +import java.net.URL; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParserFactory; import javax.xml.transform.ErrorListener; @@ -50,6 +51,7 @@ import org.apache.tools.ant.taskdefs.XSLTProcess; import org.apache.tools.ant.types.XMLCatalog; import org.apache.tools.ant.types.Resource; import org.apache.tools.ant.types.resources.FileResource; +import org.apache.tools.ant.types.resources.URLResource; import org.apache.tools.ant.util.FileUtils; import org.apache.tools.ant.util.JAXPUtils; import org.xml.sax.EntityResolver; @@ -64,6 +66,13 @@ import org.xml.sax.XMLReader; */ public class TraXLiaison implements XSLTLiaison3, ErrorListener, XSLTLoggerAware { + /** + * Helper for transforming filenames to URIs. + * + * @since Ant 1.7 + */ + private static final FileUtils FILE_UTILS = FileUtils.getFileUtils(); + /** * The current Project */ @@ -126,6 +135,7 @@ public class TraXLiaison implements XSLTLiaison3, ErrorListener, XSLTLoggerAware FileResource fr = new FileResource(); fr.setProject(project); fr.setFile(stylesheet); + setStylesheet(fr); } /** @@ -249,10 +259,23 @@ public class TraXLiaison implements XSLTLiaison3, ErrorListener, XSLTLoggerAware // The line below is a hack: the system id must an URI, but it is not // cleat to get the URI of an resource, so just set the name of the // resource as a system id - src.setSystemId(resource.getName()); + src.setSystemId(resourceToURI(resource)); return src; } + private String resourceToURI(Resource resource) { + if (resource instanceof FileResource) { + File f = ((FileResource) resource).getFile(); + return FILE_UTILS.toURI(f.getAbsolutePath()); + } + if (resource instanceof URLResource) { + URL u = ((URLResource) resource).getURL(); + return String.valueOf(u); + } else { + return resource.getName(); + } + } + /** * Read in templates from the stylesheet */ diff --git a/src/testcases/org/apache/tools/ant/taskdefs/optional/XsltTest.java b/src/testcases/org/apache/tools/ant/taskdefs/optional/XsltTest.java index 8ce7fd540..dea0a9620 100644 --- a/src/testcases/org/apache/tools/ant/taskdefs/optional/XsltTest.java +++ b/src/testcases/org/apache/tools/ant/taskdefs/optional/XsltTest.java @@ -88,5 +88,16 @@ public class XsltTest extends BuildFileTest { public void testXMLWithEntitiesInNonAsciiPath() throws Exception { executeTarget("testXMLWithEntitiesInNonAsciiPath"); } + + /** + * check that the system id gets set properly on stylesheets. + * @throws Exception if something goes wrong. + */ + public void testStyleSheetWithInclude() throws Exception { + executeTarget("testStyleSheetWithInclude"); + if (getLog().indexOf("java.io.FileNotFoundException") != -1) { + fail("xsl:include was not found"); + } + } }