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