0

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

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

4

1 回答 1

1

通过检查 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>
于 2013-09-09T18:58:40.280 回答