如何在 XSL-FO 中正确插入一个空行?
How to insert a blank line in XSL-FO properly?
我正在想办法正确地做到这一点。我尝试在代码中使用处理指令,但它们似乎完全被忽略了。
文中:
end of a paragraph.<?linebreak?></p>
至于模板,我试过:
<xsl:template match="processing-instruction('linebreak')">
<fo:block>
<xsl:apply-templates/>
<fo:leader/>
</fo:block>
</xsl:template>
或仅用于测试目的:
<xsl:template match="processing-instruction('linebreak')">
<fo:block>XXXX</fo:block>
</xsl:template>
无论我做什么,模板都不会被使用。
我在 eXist-db 应用程序 (3.0RC1) 中使用它,但我认为这与 eXist-db 无关。有 FOP 1.1。我不确定撒克逊版本。
传统上,您不会在段落末尾插入换行符。相反,您指定例如space-below="12pt" 在包含该段落的 fo:block 上。
总是会插入换行符,即使您不想要它(例如,当段落位于页面底部并且换行符会换行到下一页时。space -below 可以是有条件的,所以如果这个 space 出现在页面底部,它会被折叠起来。这会产生更好看的布局。
No matters what I do, the template is never used.
关于这部分问题,一个可能的解释是匹配父元素的模板(<p>
在你的例子中)在应用模板时默默地忽略处理指令 .
例如,这个准标识样式表在处理元素时会忽略处理指令,因此永远不会执行它们的匹配模板:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="* | @*">
<xsl:copy>
<!-- this only processes elements, attributes and text nodes! -->
<xsl:apply-templates select="* | @* | text()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="processing-instruction('linebreak')">
XXXXX
</xsl:template>
</xsl:stylesheet>
为了考虑处理指令,模板匹配元素也必须显式应用模板:
<xsl:template match="* | @*">
<xsl:copy>
<xsl:apply-templates select="* | @* | text() | processing-instruction()"/>
</xsl:copy>
</xsl:template>
请注意,使用 <xsl:apply-templates/>
也不起作用,因为它不 select 处理指令或属性,只是元素和文本节点。
我正在想办法正确地做到这一点。我尝试在代码中使用处理指令,但它们似乎完全被忽略了。
文中:
end of a paragraph.<?linebreak?></p>
至于模板,我试过:
<xsl:template match="processing-instruction('linebreak')">
<fo:block>
<xsl:apply-templates/>
<fo:leader/>
</fo:block>
</xsl:template>
或仅用于测试目的:
<xsl:template match="processing-instruction('linebreak')">
<fo:block>XXXX</fo:block>
</xsl:template>
无论我做什么,模板都不会被使用。
我在 eXist-db 应用程序 (3.0RC1) 中使用它,但我认为这与 eXist-db 无关。有 FOP 1.1。我不确定撒克逊版本。
传统上,您不会在段落末尾插入换行符。相反,您指定例如space-below="12pt" 在包含该段落的 fo:block 上。
总是会插入换行符,即使您不想要它(例如,当段落位于页面底部并且换行符会换行到下一页时。space -below 可以是有条件的,所以如果这个 space 出现在页面底部,它会被折叠起来。这会产生更好看的布局。
No matters what I do, the template is never used.
关于这部分问题,一个可能的解释是匹配父元素的模板(<p>
在你的例子中)在应用模板时默默地忽略处理指令 .
例如,这个准标识样式表在处理元素时会忽略处理指令,因此永远不会执行它们的匹配模板:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="* | @*">
<xsl:copy>
<!-- this only processes elements, attributes and text nodes! -->
<xsl:apply-templates select="* | @* | text()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="processing-instruction('linebreak')">
XXXXX
</xsl:template>
</xsl:stylesheet>
为了考虑处理指令,模板匹配元素也必须显式应用模板:
<xsl:template match="* | @*">
<xsl:copy>
<xsl:apply-templates select="* | @* | text() | processing-instruction()"/>
</xsl:copy>
</xsl:template>
请注意,使用 <xsl:apply-templates/>
也不起作用,因为它不 select 处理指令或属性,只是元素和文本节点。