繁体   English   中英

XSL-FO两列表

[英]XSL-FO two column table

我需要创建一个2列表,由不固定编号的图像填充,每个单元格一个图像,每行两个单元格。 我们正在使用XSL-FO

我将此XSL数据作为XSL的输入

<viewList>
    <views order="1">data:image/jpg;base64,/9j/4AAQSkZJRg...(base64 data)</views>
    <views order="2">data:image/jpg;base64,/9j/4AAQSkZ432...(base64 data)</views>
    <views order="3">data:image/jpg;base64,/9j/4AAQSkZdgd...(base64 data)</views>
    <views order="4">data:image/jpg;base64,/9j/4AAQSkZ775...(base64 data)</views>
    <views order="5">data:image/jpg;base64,/9j/4AAQSk7655...(base64 data)</views>
</viewList>

如您所见,标记views内容是base64信息,对图像进行编码。 他们很长。

为了渲染图像,我使用了标签fo:external-graphic 因此,我设法将所有图像绘制在一个表中:

<fo:table>
<fo:table-body>   
    <xsl:for-each select="viewList/views">                                      
        <fo:table-row>
            <fo:table-cell>                                        
                <fo:block text-align="center">
                    <fo:external-graphic src="{current()}"/>
                </fo:block>                    
            </fo:table-cell>
        </fo:table-row>
    </xsl:for-each>
</fo:table-body>  
</fo:table>

正如你看到的; 这在娱乐上无效; 因为每个单元格都有一个图像...关于如何将它们分成两列的任何想法?

实现此目的的一种方法是最初仅选择将成为每行第一个单元格的views元素。

 <xsl:for-each select="viewList/views[position() mod $cellsPerRow = 1]">

(其中cellsPerRow是设置为2的变量,这样您就可以轻松地更改每行的单元格数量)。 这将构成fo:table-row

然后,要选择实际构成该行的单元格,您可以这样做

<xsl:for-each select="self::*|following-sibling::views[position() &lt; $cellsPerRow]" >

试试这个XSLT

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="fo" version="2.0">
    <xsl:output method="xml" encoding="UTF-8" indent="yes" />

    <xsl:param name="cellsPerRow" select="2" />
    <xsl:template match="/">
        <fo:table>
            <fo:table-body>   
                <xsl:for-each select="viewList/views[position() mod $cellsPerRow = 1]">                                      
                    <fo:table-row>
                        <xsl:apply-templates select="self::*|following-sibling::views[position() &lt; $cellsPerRow]" />
                    </fo:table-row>
                </xsl:for-each>
            </fo:table-body>  
        </fo:table>
    </xsl:template>

    <xsl:template match="views">
        <fo:table-cell>                                        
            <fo:block text-align="center">
                <fo:external-graphic src="{current()}"/>
            </fo:block>                    
        </fo:table-cell>
    </xsl:template>
</xsl:stylesheet>

注意,我已经从使用xsl:for-each切换到xsl:apply-templates主要是为了避免答案中的缩进过多。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM