【问题标题】:XSL-FO two column tableXSL-FO 两列表
【发布时间】:2015-06-14 11:46:47
【问题描述】:

我需要创建一个 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>

如你所见;这是无效的;因为它每个单元格都有一个图像...关于如何将它们放在 2 列中的任何想法?

【问题讨论】:

    标签: html xml xslt xsl-fo


    【解决方案1】:

    实现此目的的一种方法是最初只选择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,主要是为了避免答案中出现过多的缩进。

    【讨论】:

    • 太棒了 @Tim-c 效果很好!非常感谢!!
    猜你喜欢
    • 2013-01-30
    • 1970-01-01
    • 1970-01-01
    • 2011-11-13
    • 1970-01-01
    • 2017-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多