Xslt XSL-如何对特定数量的元素进行分组
我有几个段落,我只想在一页上显示其中的5个段落。为此,我使用keep-together=“always”属性 对于以下输入:Xslt XSL-如何对特定数量的元素进行分组,xslt,Xslt,我有几个段落,我只想在一页上显示其中的5个段落。为此,我使用keep-together=“always”属性 对于以下输入: <paragraphs> <paragraph/> <paragraph/> <paragraph/> <paragraph/> <paragraph/> <paragraph/> <paragraph/> <
<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解析器异常)中
有人知道我如何解决这个问题吗?您检查position()mod 5的方法是正确的,但是您需要采取的方法不是选择所有段落元素并使用xsl:if检查位置,是将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。注:我已将“5”参数化,以便于调整每个块的段落数
<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>