我有几个段落,我想在一个页面上只显示其中的5个。要做到这一点,我使用keep-together =“always”属性。
以下输入:
<paragraphs>
<paragraph/>
<paragraph/>
<paragraph/>
<paragraph/>
<paragraph/>
<paragraph/>
<paragraph/>
<paragraph/>
<paragraph/>
<paragraph/>
</paragraphs>
我想得到类似的东西:
<fo:block keep-together="always">
<paragraph/>
<paragraph/>
<paragraph/>
<paragraph/>
<paragraph/>
</fo:block>
<fo:block keep-together="always">
<paragraph/>
<paragraph/>
<paragraph/>
<paragraph/>
<paragraph/>
</fo:block>
我首先尝试过以下内容:
<xsl:template match="paragraphs">
<fo:block keep-together="always">
<xsl:for-each select="paragraph">
<xsl:if test="position() mod(5) = 1 and not(position() = 1)">
</fo:block>
<fo:block keep-together="always">
</xsl:if>
<xsl:apply-templates select="."/>
</xsl:for-each>
</fo:block>
</xsl:template>
但问题是它没有编译,因为fo:block的结束位于xsl:if(编译时的sax解析器异常)。
有没有人知道如何解决这个问题?
答案 0 :(得分:1)
您正在检查position()mod 5,但您需要采取的方法是选择所有段元素并使用 xsl检查位置:如果,则更改 xsl:for-each 以仅选择第1个,第6个,第11个等元素
<xsl:for-each select="paragraph[position() mod 5 = 1]">
这将是 fo:block 的基础。在此块中,您可以选择构成块的所有段元素。
<xsl:apply-templates select="self::*|following-sibling::paragraph[position() < 5]"/>
这是完整的XSLT。注意我已经参数化了&#39; 5&#39;使每个块的段落数量变得容易。
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl:output method="xml" indent="yes"/>
<xsl:param name="para" select="5" />
<xsl:template match="paragraphs">
<xsl:for-each select="paragraph[position() mod $para = 1]">
<fo:block keep-together="always">
<xsl:apply-templates select="self::*|following-sibling::paragraph[position() < $para]"/>
</fo:block>
</xsl:for-each>
</xsl:template>
<xsl:template match="paragraph">
<xsl:copy-of select="." />
</xsl:template>
</xsl:stylesheet>