我正在试图弄清楚如何正确地做到这一点。我试图在代码中使用处理指令,但似乎它们在某种程度上被忽略了。
在文中:
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。我不确定撒克逊版本。
答案 0 :(得分:3)
传统上,您不会在段落末尾插入换行符。相反,你指定例如包含段落的fo:块上的space-below =“12pt”。
总是会插入换行符,即使您不想要它(例如,当段落放在页面底部并且换行符将换行到下一页时。下面的空格可以是有条件的,如果它出现在页面底部,则该空间将被折叠。这样可以使布局更好看。
答案 1 :(得分:2)
无论我做什么,都不会使用模板。
关于这部分问题,可能的解释是匹配父元素的模板(示例中为<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/>
也无法正常工作,因为它不会选择处理指令或属性,只会选择元素和文本节点。