2017-03-07 81 views
1

我想弄清楚如何做到这一点。我试图在代码中使用处理指令,但似乎它们在某种程度上被忽略。如何正确插入XSL-FO中的空白行?

在文本:

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

由于模板从未执行过,所以第一个问题似乎是XSLT;但是,如果不知道样式表的其余部分,将很难解决。 – lfurini

+0

谢谢,我会尽量提供更合理的样本。问题在于它是大型项目的一部分。 –

+1

下面的两个答案都是正确的。 *最好的答案给你的问题是没有插入他们的第一个地方,他们应该(几乎必须)由XSL FO引擎使用空间来处理(第一个答案)。只有这样,他们才会得到适当的对待和崩溃。 –

回答

2

没有重要的我做什么,永远不会使用的模板。

关于这部分问题,可能的解释是,匹配父元素的模板(在您的示例中为<p>)0当应用模板时,静静地忽略处理指令。

例如,这种准标识样式表忽略当元素被处理,因此永远不会执行它们的匹配模板的处理指令:

<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/>不会WO因为它不选择处理指令或属性,只是元素和文本节点。

+1

非常感谢,这当然是技术上的答案。然而,霍布斯对于这个事实是正确的,因为它可能更好地使用一些再现指令。 –

3

传统上,您不要在段落末尾插入换行符。相反,您可以指定例如包含段落的fo:块的space-below =“12pt”。

即使您不需要换行符,也会插入换行符(例如,当段落放在页面的底部并且换行符会换行到下一页时。有条件的,所以这个空间将如果它出现在页面的底部坍塌,这将导致一个更好看的布局。

+1

谢谢你,你的想法背后 - 为什么要使用处理指令的情况下,我需要一些再现指令! –