OASIS Mailing List ArchivesView the OASIS mailing list archive below
or browse/search using MarkMail.

 


Help: OASIS Mailing Lists Help | MarkMail Help

docbook-apps message

[Date Prev] | [Thread Prev] | [Thread Next] | [Date Next] -- [Date Index] | [Thread Index] | [List Home]


Subject: Re: [docbook-apps] Embedding DocBook â PDF transformation in a Java web app


On 29 Jul 2023, at 13:48, Paul Hoadley <paulh@logicsquad.net> wrote:

I'll put together a minimal example and see if you can put me in the right direction.

To recap, I'm building a Java project that will encapsulate the DocBook stylesheets and some classes to do some transformations, all packaged as a JAR to become part of a larger web app. The project uses the standard Maven layout, and Saxon-HE 12.3. I've put the XSL in src/main/resources/xsl:

paulh@elmo xsl % pwd
/Users/paulh/Projects/Java/janus/src/main/resources/xsl
paulh@elmo xsl % ls -l
total 688
drwxr-xr-x@ 48 paulh  staff    1536 29 Jul  2020 docbook-xsl-1.79.2
-rw-r--r--   1 paulh  staff   16681 24 Jul 10:41 header-footer.xsl
-rw-r--r--   1 paulh  staff    7494 28 Jul 14:23 juno-driver.xsl
-rw-r--r--   1 paulh  staff    8689 24 Jul 14:33 table.xsl
-rw-r--r--   1 paulh  staff  307717 18 Jul 12:49 titlepage.xsl

juno-driver.xsl is the top-level customisation stylesheet, and it imports the others:

  <xsl:import href="docbook-xsl-1.79.2/fo/docbook.xsl" />
  <xsl:import href="titlepage.xsl" />
  <xsl:import href="table.xsl" />
  <xsl:import href="header-footer.xsl" />

To be clear, addressing the XSL stylesheets as files on the filesystem works just fine. That is, this does exactly what it should:

private Document transformDocument(Document document) throws TransformerException, FileNotFoundException {
DOMResult result = new DOMResult();
TransformerFactory factory = TransformerFactory.newInstance();
factory.setURIResolver(new StandardURIResolver());
InputStream is = new FileInputStream(new File("/Users/paulh/Projects/Java/janus/src/main/resources/xsl/juno-driver.xsl"));
Source source = new StreamSource(is, "file:/Users/paulh/Projects/Java/janus/src/main/resources/xsl/juno-driver.xsl");
Transformer transformer = factory.newTransformer(source);
transformer.transform(new DOMSource(document), result);
return (Document) result.getNode();
}

What I want to do, though, is reference the stylesheets as classpath resources. StandardURIResolver claims to be able to handle the "classpath URI scheme", so I tried this:

private Document transformDocument(Document document) throws TransformerException, FileNotFoundException {
DOMResult result = new DOMResult();
TransformerFactory factory = TransformerFactory.newInstance();
factory.setURIResolver(new StandardURIResolver());
InputStream is = XmlTest.class.getResourceAsStream("/xsl/juno-driver.xsl");
Source source = new StreamSource(is, "classpath:/xsl/juno-driver.xsl");
Transformer transformer = factory.newTransformer(source);
transformer.transform(new DOMSource(document), result);
return (Document) result.getNode();
}

Which results in:

Error 
  XTSE0165: I/O error reported by XML parser processing
  classpath:xsl/docbook-xsl-1.79.2/fo/docbook.xsl: unknown protocol: classpath
javax.xml.transform.TransformerConfigurationException: net.sf.saxon.s9api.SaxonApiException: I/O error reported by XML parser processing classpath:xsl/docbook-xsl-1.79.2/fo/docbook.xsl
at net.sf.saxon.jaxp.SaxonTransformerFactory.newTemplates(SaxonTransformerFactory.java:158)
at net.sf.saxon.jaxp.SaxonTransformerFactory.newTransformer(SaxonTransformerFactory.java:112)
at net.logicsquad.janus.XmlTest.transformDocument(XmlTest.java:142)

If StandardURIResolver can handle classpath URIs, have I just got the syntax or other usage wrong somewhere?


-- 
Paul Hoadley
https://logicsquad.net/
https://www.linkedin.com/company/logic-squad/



[Date Prev] | [Thread Prev] | [Thread Next] | [Date Next] -- [Date Index] | [Thread Index] | [List Home]