如何在xsl-fo中正确显示制表?

时间:2014-08-18 10:29:46

标签: xslt xsl-fo apache-fop

我有一个XML文档,我正在创建一个XSL-FO文件,使用apache-fop将其转换为pdf。

在xml中,有部分< code>展示......代码。

在xsl-fo中,我添加了white-space =“pre”语句以保留代码格式,但是表格显示为单个空格:

XML部分:

<code><![CDATA[
function callback( widget )
{
    var ui = widget; // It should be a tab
}
]]></code>

XSL-FO部分:

<xsl:template match="code">
    <fo:block font-size="10pt" font-family="monospace" white-space="pre" color="#008000" background-color="#f8f8f8">
        <xsl:apply-templates/>
    </fo:block>
</xsl:template>

结果PDF:

function callback( widget )
{
 var ui = widget;  // It should be a tab
}

所以我的问题是:如何保留或设置制表的大小?


编辑:我正在使用apache-fop 1.1

一个完整的例子:

proyecto.xml(不要忘记在“var ui ...”之前用标签替换4个空格。)

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="proyecto.xsl"?>
<document>
<code><![CDATA[
function callback( widget )
{
    var ui = widget; // It should be a tab
}
]]></code>
</document>

proyecto.xsl

<xsl:stylesheet
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
    xmlns:fo="http://www.w3.org/1999/XSL/Format">

    <xsl:template match ="document">
        <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
            <fo:layout-master-set>
                <fo:simple-page-master master-name="OnePage" margin="1in" 
                    page-height="29.7cm" 
                    page-width="21cm"
                    margin-top="2.5cm"
                    margin-bottom="2.5cm"
                    margin-left="3.5cm"
                    margin-right="2.5cm">
                    <fo:region-body margin="0cm"/>
                </fo:simple-page-master>
                <fo:page-sequence-master master-name="Page">
                    <fo:single-page-master-reference master-reference="OnePage"/>
                </fo:page-sequence-master>
            </fo:layout-master-set>

            <fo:page-sequence master-reference="Page">
                <fo:flow flow-name="xsl-region-body">
                    <xsl:apply-templates/>
                </fo:flow>
            </fo:page-sequence>
        </fo:root>
    </xsl:template>

    <xsl:template match="code">
        <fo:block font-size="10pt" font-family="monospace" white-space="pre">
            <xsl:apply-templates/>
            <!--<xsl:value-of select="replace( . , 'a', 'b')"/>-->
        </fo:block>
    </xsl:template>

</xsl:stylesheet>

PDF结果(屏幕):

enter image description here

1 个答案:

答案 0 :(得分:1)

将标签替换为四个空格,如评论中已经提到的@mzjn所示。

XML输入

<code><![CDATA[
function callback( widget )
{
&#09;var ui = widget; // It should be a tab
}
]]></code>

XSLT样式表

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0"
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
      xmlns:fo="http://www.w3.org/1999/XSL/Format">
  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="/">
    <fo:root>
      <fo:layout-master-set>
        <fo:simple-page-master master-name="A4-portrait"
              page-height="29.7cm" page-width="21.0cm" margin="2cm">
          <fo:region-body/>
        </fo:simple-page-master>
      </fo:layout-master-set>
      <fo:page-sequence master-reference="A4-portrait">
        <fo:flow flow-name="xsl-region-body">
          <fo:block font-size="10pt" font-family="monospace" linefeed-treatment="preserve" white-space-collapse="false" white-space-treatment="preserve" wrap-option="no-wrap" color="#008000" background-color="#f8f8f8">
            <xsl:value-of select="replace(code,'&#09;','    ')"/>
          </fo:block>
        </fo:flow>
      </fo:page-sequence>
    </fo:root>
  </xsl:template>

</xsl:stylesheet>

现在,在用空格替换制表符后,FOP正确地呈现输出。

  

enter image description here

输出标签没有明显的缺陷,但请记住,就whitespace-treatment属性http://xmlgraphics.apache.org/fop/compliance.html而言,Apache FOP只是部分兼容,即使它说只有fo:inline元素受此影响。