换行处理="保留"不适用于通过xsl-fo生成pdf的下一行

时间:2014-04-14 17:47:44

标签: xml xslt xsl-fo

我的xml文件

<entries>
 <entry ID="93" ENTRY_TYPE="Text1" ENTRYNM="First line:
  Second line
  third line
  fourth line" ENTRY_DT="12-Jan-2004"/></entries>

我的xsl-fo

<fo:block linefeed-treatment="preserve" white-space-treatment='preserve'
      white-space-collapse='false'>
<xsl:value-of select="./entries/entry/@ENTRYNM"/>
</fo:block>

我正在生成包含ENTRYNM的pdf,它应该保留下一行,如xml所示。

Like example:
First line:
Second line
third line
fourth line

1 个答案:

答案 0 :(得分:6)

这是因为Attribute Value Normalization。换行符被标准化为空格。保留这些的唯一方法是在属性值中使用字符引用。

例如,如果你有这个XML:

<entry ID="93" ENTRY_TYPE="Text1" ENTRYNM="First line:
    Second line
    third line
    fourth line" ENTRY_DT="12-Jan-2004"/>

和这个XSLT(为了简洁省略了xsl-fo命名空间):

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="/*">        
        <block linefeed-treatment="preserve">
            <xsl:value-of select="@ENTRYNM"/>            
        </block>
    </xsl:template>

</xsl:stylesheet>

您将获得此输出(标准化):

<block linefeed-treatment="preserve">First line:     Second line     third line     fourth line</block>

如果您在输入中将换行符更改为字符引用:

<entry ID="93" ENTRY_TYPE="Text1" ENTRYNM="First line:&#xA;
    Second line&#xA;
    third line&#xA;
    fourth line" ENTRY_DT="12-Jan-2004"/>

同样的XSLT现在产生这个输出:

<block linefeed-treatment="preserve">First line:
     Second line
     third line
     fourth line</block>

这是规范化的另一个视觉示例......

如果我们采用第一个XML输入示例:

<entry ID="93" ENTRY_TYPE="Text1" ENTRYNM="First line:
    Second line
    third line
    fourth line" ENTRY_DT="12-Jan-2004"/>

并尝试根据&#xA;进行标记:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="/*">        
        <block linefeed-treatment="preserve">
            <xsl:for-each select="tokenize(@ENTRYNM,'&#xA;')">
                <token><xsl:value-of select="."/></token>
            </xsl:for-each>
        </block>
    </xsl:template>

</xsl:stylesheet>

我们在输出中得到一个token

<block linefeed-treatment="preserve">
   <token>First line:     Second line     third line     fourth line</token>
</block>

如果我们使用第二个XML输入示例(将断点替换为&#xA;个引用),我们会得到4个单独的token s:

<block linefeed-treatment="preserve">
   <token>First line:</token>
   <token>     Second line</token>
   <token>     third line</token>
   <token>     fourth line</token>
</block>