javax.xml.transform.Transformer удаляет необходимые пробелы (преобразование xml в текст)

#java #xml #whitespace #transform #xslt

#java #xml #пробелы #преобразование #xslt

Вопрос:

Я пытаюсь преобразовать 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>amp;#xa;</xsl:text>
    <xsl:text>amp;#xa;</xsl:text>
</xsl:if>
</xsl:template>
  

Вывод xsltproc:

 Hours01     Hours Report                                                                                                2011-04-14
  

И javax.xml.transformer.Выходные данные Transformer:

 Hours01Hours Report2011-04-14
  

Комментарии:

1. Какие пробелы вы хотите сохранить? не могли бы вы написать пример фактического преобразования, которое вы хотите иметь?

2. Он объединяет $ blank (который, предположительно, представляет собой длинную строку пробелов) в каждое поле, а затем использует substring() для создания строки с заполнением справа нужной длины. Он хочет, чтобы эти конечные пробелы были сохранены в выходных данных.

Ответ №1:

Как вы определили $ blank? Когда я делаю

 <xsl:variable name="blank">                                  </xsl:variable>
  

Я получаю те же результаты, что и вы. Однако следующие действия привели к желаемым результатам

 <xsl:variable name="blank" select="'                                                '"/>
  

Комментарии:

1. Конечно же, по какой-то причине у xsltproc нет проблем с <…> … пробелами … <…>, но javax.xml удаляет. Большое спасибо.

2. @David Jaquay: Jave поступает правильно, согласно w3.org/TR/xslt#strip

Ответ №2:

Попробуйте использовать символ xml вместо пробела в вашем xslt.

 amp;#160;
  

Или используйте текстовый тег..

 <xsl:text> </xsl:text>
  

Я надеюсь, что это поможет.