XSL-FO:在 for-each select / group-ending-with 语句中使用变量?

XSL-FO: Use variable within for-each select / group-ending-with statement?

假设我有一个 XML 文件,如下所示:

<books>
  <book>
    <name>Book 1</name>
  </book>
  <book>
    <name>Book 2</name>
  </book>
  <book>
    <name>Book 3</name>
  </book>
  <book>
    <name>Book 4</name>
  </book>
  <book>
    <name>Book 5</name>
  </book>
  <book>
    <name>Book 6</name>
  </book>
  <book>
    <name>Book 7</name>
  </book>
  <book>
    <name>Book 8</name>
  </book>
  <book>
    <name>Book 9</name>
  </book>
  <book>
    <name>Book 10</name>
  </book>
</books>

我有一些像这样的 XSL-FO:

<xsl:template match="books" mode="table">
        <fo:table border="1pt solid black" table-layout="fixed"
            width="100%" font-size="11pt">
            <fo:table-body border="inherit">

                <xsl:for-each-group select="book" group-ending-with="book[position() mod 5 = 0]">
                    <fo:table-row table-layout="fixed" border="inherit">
                        <xsl:for-each select="current-group()">
                            <fo:table-cell border="inherit" padding-left="5px"
                                padding-top="1px" padding-bottom="1px">
                                <fo:block>
                                    <xsl:value-of select="name" />
                                </fo:block>
                            </fo:table-cell>
                        </xsl:for-each>
                        <xsl:for-each select="0 to (5 - count(current-group())-1)">
                            <fo:table-cell border="inherit">
                                <fo:block>
                                    <xsl:text>&nbsp;</xsl:text>
                                </fo:block>
                            </fo:table-cell>
                        </xsl:for-each>

                    </fo:table-row>
                </xsl:for-each-group>

            </fo:table-body>
        </fo:table>
</xsl:template>

现在,这段代码创建了一个包含 5 列的 table,显示我的 XML 文件中每本书的名称。首先,for-each-group 将列表划分为 5(或更少,如果没有剩余)书籍,然后第一个 for-each-select 将书名放入 table,而第二个 for-each-select 计算出我的 table 中是否有任何空位,并在最后几列中放置不间断空格。

结果 table 如下所示:

一切都很好,但现在我希望能够在 table 中指定列数,而不是使用当前的硬编码值 5。因此,如果我改为提供一个看起来像这样的 xml 文件...

<books>
  <cols>3</cols>
  /* list of books */
</books>

有什么方法可以使用 cols 节点来指定我希望在结果 table 中看到的列数?如果没有,是否有更好的方法来完成我正在寻找的东西?

我认为有必要使用这样的变量:

<xsl:template match="books" mode="table">
    <xsl:variable name="cols" select="xs:integer(cols)"/>

然后,在 select 语句中使用变量,如下所示:

<xsl:for-each-group select="book" group-ending-with="book[position() mod $cols = 0]">

<xsl:for-each select="0 to ($cols - count(current-group())-1)">

演示: http://xsltransform.net/pPqsHUc/1