首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XSL-FO两列表

XSL-FO两列表
EN

Stack Overflow用户
提问于 2015-04-09 07:58:03
回答 1查看 1K关注 0票数 0

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

我把这个XSL数据作为XSL的输入。

代码语言:javascript
复制
<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。因此,我设法将所有图像绘制在一个表中:

代码语言:javascript
复制
<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>

正如你所看到的,这在本质上是无效的,因为它是每个细胞的图像.知道怎么把它们写在两栏里吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-09 08:40:07

实现这一目标的一种方法是,最初只选择将成为每行中第一个单元格的views元素。

代码语言:javascript
复制
 <xsl:for-each select="viewList/views[position() mod $cellsPerRow = 1]">

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

然后,要选择实际形成行的单元格,可以执行以下操作

代码语言:javascript
复制
<xsl:for-each select="self::*|following-sibling::views[position() &lt; $cellsPerRow]" >

试试这个XSLT

代码语言:javascript
复制
<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,主要是为了避免在答案中出现过多的缩进。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29532941

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档