我试图弄清楚如何正确执行此操作。我尝试使用代码中的处理说明,但似乎根本被忽略了。
文本中:
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>
无论我做什么,模板从未使用。
我在存在的db应用程序(3.0rc1)中使用它,但我认为这与现有db无关。有FOP 1.1。我不确定撒克逊版。
传统上,您不会在段落结束时插入换行路线。相反,您指定例如fo:包含该段落的fo:block上的空格below =" 12pt"。
即使您不想要它,也总是会插入断路(例如,当段落放置在页面底部时,线路断裂将包裹在下一页上。,因此,如果该空间出现在页面底部。这会导致看起来更好的布局。
无论我做什么,模板从未使用。
关于问题的这一部分,可能的解释是匹配父元素的模板(示例中的<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/>
也无法正常工作,因为它不选择处理指令或属性,仅元素和文本节点。