JDK packaged JAXP transformer indent no longer working in OpenJDK 11

Niels Bertram nielsbne at gmail.com
Wed May 8 13:44:11 UTC 2019


Hi Frank,

the validity of the produced XML is not impaired. But given that we process
and package the schema docs for humans, the readability is as important as
validity. As a workaround, we have been able to rectify this issue by
overriding the internal transformers with the official Xalan 2.7.2 ones.
But given I am not the only one facing this issue, looks like a good case
to evaluate if the changes applied in JDK-8087303 should be considered a
regression. Certainly broke the the functionality we are used to when
specifying indent=yes on the transformer factory.

Cheers,
Niels


On Wed, May 8, 2019 at 4:23 PM Frank Yuan <frank.yuan at oracle.com> wrote:

> Hi Niels
>
> Yes, it's caused by JDK-8087303. But it's not a regression.
>
> This change has no impact to any xml parser at all, although it is not
> backward-compatible for the human readability,
>
> Actually JDK-8087303 tried to make the form better, but the serializer
> can't distinguish whether the space is a meaningful content or just an
> indentation made by the author, so we had to regard the spaces as xml data
> content.
>
> I think your program should not depend on any specified data format, so
> you have not any impact indeed, don't you?
>
> Thanks
> Frank
>
> > Subject: JDK packaged JAXP transformer indent no longer working in
> OpenJDK 11
> >
> > Hi JDK devs,
> >
> > we recently started to upgrade from OpenJDK 8 to 11 and noticed that the
> > Xalan transformer shipped with the JDK is not handling whitespace
> > indentation properly anymore. Whilst it is not impacting the validity of
> > the XML produced, it is rather annoying that indented results now have
> > extra line breaks. E.g. we post-process some generated XSD files for
> > publication but when done in OpenJDK 11 they look horrible.
> >
> > There are a few people seeing this issue:
> >
> >
> https://stackoverflow.com/questions/53596202/javax-xml-transform-transformer-line-endings-no-longer-respect-system-property
> >
> This is not same as your issue.
>
> > https://github.com/CodeFX-org/java-9-wtf/tree/master/xml-transformer
> This talks about JDK-8087303. These changes were described in JDK 9
> release notes.
>
> >
> > It may be related to the changes made in this ticket:
> >
> > https://bugs.openjdk.java.net/browse/JDK-8087303
> >
> > Would it be possible for someone with permissions to raise a defect for
> > this?
> >
> > $ java -version
> > openjdk version "1.8.0_212"
> > OpenJDK Runtime Environment (build 1.8.0_212-8u212-b01-1~deb9u1-b01)
> > OpenJDK 64-Bit Server VM (build 25.212-b01, mixed mode)
> >
> > (sources at the end of mail)
> >
> > $ javac Transform.java
> >
> > $ java Transform
> > <?xml version="1.0" encoding="UTF-8"?><books>
> >   <book>
> >     <title>test book</title>
> >   </book>
> > </books>
> >
> > $ java Transform --indent
> > <?xml version="1.0" encoding="UTF-8"?><books>
> >   <book>
> >     <title>test book</title>
> >   </book>
> > </books>
> >
> >
> > $ java -version
> > openjdk version "11.0.3" 2019-04-16
> > OpenJDK Runtime Environment (build 11.0.3+1-Debian-1bpo91)
> > OpenJDK 64-Bit Server VM (build 11.0.3+1-Debian-1bpo91, mixed mode,
> sharing)
> >
> > $ java Transform
> > <?xml version="1.0" encoding="UTF-8"?><books>
> >   <book>
> >     <title>test book</title>
> >   </book>
> > </books>
> >
> > $ $ java -Djaxp.debug=1 Transform --indent
> > JAXP: find factoryId =javax.xml.transform.TransformerFactory
> > JAXP: loaded from fallback value:
> > com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl
> > JAXP: created new instance of class
> > com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl using
> > ClassLoader: null
> > <?xml version="1.0" encoding="UTF-8"?><books>
> >
> >     <book>
> >
> >         <title>test book</title>
> >
> >     </book>
> >
> > </books>
> >
> >
> > Source for Transform.java
> >
> > -------------------------------
> >
> > import javax.xml.transform.OutputKeys;
> > import javax.xml.transform.Templates;
> > import javax.xml.transform.Transformer;
> > import javax.xml.transform.TransformerFactory;
> > import javax.xml.transform.stream.StreamResult;
> > import javax.xml.transform.stream.StreamSource;
> > import java.io.ByteArrayInputStream;
> > import java.io.StringWriter;
> > import java.nio.charset.StandardCharsets;
> >
> > public class Transform {
> >
> >   public static void main(String[] args) {
> >
> >     try {
> >
> >       boolean indent = args != null && args.length == 1 &&
> > "--indent".equals(args[0]);
> >
> >       String template = "<xsl:stylesheet version=\"1.0\" xmlns:xsl=\"
> > http://www.w3.org/1999/XSL/Transform\">\n" +
> >         "  <xsl:template match=\"@*|node()\">\n" +
> >         "    <xsl:copy>\n" +
> >         "      <xsl:apply-templates select=\"@*|node()\"/>\n" +
> >         "    </xsl:copy>\n" +
> >         "  </xsl:template>\n" +
> >         "</xsl:stylesheet>";
> >
> >       String input = "<books>\n" +
> >         "  <book>\n" +
> >         "    <title>test book</title>\n" +
> >         "  </book>\n" +
> >         "</books>";
> >
> >       Templates xsl = TransformerFactory.newInstance()
> >         .newTemplates(new StreamSource(new
> > ByteArrayInputStream(template.getBytes(StandardCharsets.UTF_8))));
> >
> >       final StringWriter result = new StringWriter();
> >
> >       Transformer transformer = xsl.newTransformer();
> >
> >       // as soon as we configure auto-indent the output
> >       transformer.setOutputProperty(OutputKeys.INDENT, indent ? "yes" :
> > "no");
> >
> >       transformer.transform(new StreamSource(new
> > ByteArrayInputStream(input.getBytes(StandardCharsets.UTF_8))), new
> > StreamResult(result));
> >
> >       System.out.println(result.toString());
> >     } catch (Exception e) {
> >       e.printStackTrace();
> >     }
> >
> >   }
> >
> > }
> > -------------------------------
>
>


More information about the jdk-dev mailing list