JDK packaged JAXP transformer indent no longer working in OpenJDK 11

Joe Wang huizhe.wang at oracle.com
Wed May 8 18:05:19 UTC 2019


Hi Frank,

Can we improve on JDK-8087303 to not add the additional linebreak when 
auto-indent is set? This was probably brought up at the time. But it 
makes sense not to add linebreaks when there is already one.

Thanks,
Joe

On 5/7/19, 11:21 PM, Frank Yuan 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