JDK packaged JAXP transformer indent no longer working in OpenJDK 11
Frank Yuan
frank.yuan at oracle.com
Wed May 8 06:21:24 UTC 2019
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