XSL - 如何对特定数量的元素进行分组

时间:2013-09-09 17:50:21

标签: xslt

我有几个段落,我想在一个页面上只显示其中的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解析器异常)。

有没有人知道如何解决这个问题?

1 个答案:

答案 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() &lt; 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() &lt; $para]"/>
         </fo:block>
      </xsl:for-each>
   </xsl:template>

   <xsl:template match="paragraph">
      <xsl:copy-of select="." />
   </xsl:template>
</xsl:stylesheet>