Я пытаюсь преобразовать XML в текст, используя javax.xml.transform. xsltproc корректно преобразует мой XML в правильно отформатированный текст, в то время как следующий код производит вывод почти со всеми удаленными пробелами:
final ByteArrayOutputStream out = new ByteArrayOutputStream();
final InputStream is = getClass().getResourceAsStream( xslResourceName );
final StreamSource xsltSrc = new StreamSource( is );
final Transformer transformer = tFactory.newTransformer( xsltSrc );
final Source src = new StreamSource( new StringReader( xmlData ) );
final Result res = new StreamResult( out );
transformer.setOutputProperty( "method", "text" );
transformer.setOutputProperty( "omit-xml-declaration", "yes" );
transformer.transform( src, res );
return out.toString();
Пробелы намеренно добавляются XSLT с использованием таких тегов, как:
<xsl:value-of select="substring(concat(concat($frontpadding,$cellvalue),$blank),1,$width)"/>
Для более крупного примера исходный xml может иметь:
<reportheader display="true">
<name>Hours01</name>
<date>2011-04-14</date>
<description>Hours Report</description>
<pagewidth>130</pagewidth>
</reportheader>
xsl имеет:
<xsl:template match="reportheader">
<xsl:if test="@display='true'">
<xsl:variable name="col1width" select="12"/>
<xsl:variable name="datewidth" select="10"/>
<xsl:variable name="col2width" select="$pagewidth - $col1width - $datewidth"/>
<xsl:copy-of select="substring(concat(name,$blank),1,$col1width)"/>
<xsl:copy-of select="substring(concat(description,$blank),1,$col2width)"/>
<xsl:copy-of select="substring(concat(date,$blank),1,$datewidth)"/>
<xsl:text>
</xsl:text>
<xsl:text>
</xsl:text>
</xsl:if>
</xsl:template>
Вывод xsltproc:
Hours01 Hours Report 2011-04-14
И вывод javax.xml.transformer.Transformer:
Hours01Hours Report2011-04-14