Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xslt XSL-如何对特定数量的元素进行分组_Xslt - Fatal编程技术网

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

Xslt XSL-如何对特定数量的元素进行分组,xslt,Xslt,我有几个段落,我只想在一页上显示其中的5个段落。为此,我使用keep-together=“always”属性 对于以下输入: <paragraphs> <paragraph/> <paragraph/> <paragraph/> <paragraph/> <paragraph/> <paragraph/> <paragraph/> <

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


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

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

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