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> </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)">
假设我有一个 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> </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)">