2015-04-09 3 views
0

Мне нужно создать таблицу из 2 столбцов, заполненную нефиксированными номерами изображений, по одному изображению на ячейку, по две ячейки в строке. Мы используем XSL-FOТаблица двух столбцов 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 данные, кодирование images.I только укоротить их; они довольно длинные.

Для визуализации изображений я использую тег 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> 

Как вы видите; это неслучайно; bacause его изображение на ячейку ... любая идея о том, как разместить их в 2 столбцах?

ответ

0

Один из способов добиться этого - изначально выбрать только элемент 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, чтобы избежать чрезмерного отступа в ответе.

+0

** Amazing ** @ Tim-c, который работал идеально! большое спасибо!! – Marcos

Смежные вопросы