javax.xml.transform.Transformer正在删除所需的空格(xml到文本转换)

时间:2011-04-14 16:33:40

标签: java xml whitespace transform xslt

我正在尝试使用javax.xml.transform将XML转换为文本。 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>&#xa;</xsl:text>
    <xsl:text>&#xa;</xsl:text>
</xsl:if>
</xsl:template>

xsltproc输出为:

Hours01     Hours Report                                                                                                2011-04-14

javax.xml.transformer.Transformer输出为:

Hours01Hours Report2011-04-14

2 个答案:

答案 0 :(得分:1)

你是如何定义$ blank的?当我做的时候

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

我得到与你相同的结果。但是,以下产生了您想要的结果

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

答案 1 :(得分:1)

在xslt中尝试使用xml字符作为空格。

&#160;

或使用文字标签..

<xsl:text> </xsl:text>

我希望这会有所帮助。