我的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
答案 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:

Second line

third line

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"/>
并尝试根据

进行标记:
<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,'
')">
<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输入示例(将断点替换为

个引用),我们会得到4个单独的token
s:
<block linefeed-treatment="preserve">
<token>First line:</token>
<token> Second line</token>
<token> third line</token>
<token> fourth line</token>
</block>