2015-04-23 3 views
0

У меня есть XML, который преобразуется в PDF через Apache FOP, встроенный в Java-программу и XSLT. Этот XML содержит несколько списков элементов; эти списки в XML в формате, как это:Apache FOP: печать содержимого списка из XML в формате PDF без знания размера списка?

<NameOfList> 
    <Listitem> 
     <ListItemAttributeOne/> 
     <ListItemAttributeTwo/> 
    </ListItem> 
    <ListItem> 
     <ListItemAttributeOne/> 
     <ListItemAttributeTwo/> 
    </ListItem> 
    <...more ListItems> 
</NameOfList> 

Я не знаю заранее, сколько ListItems есть, и мне нужно, чтобы напечатать их информацию в PDF файле, как это:

(1) Элемент списка атрибутов One:
Элемент списка атрибутов Два:
(2) Элемент списка атрибутов One:
Элемент списка атрибутов Два:
(...)
(п) Элемент списка атрибутов One:
Атрибут атрибута позиции Два:

Я обычно разработчик Java, поэтому я знаю, как это сделать с Java: возьмите список объектов ListItem, сохраните их в ArrayList пользовательского типа «ListItem» и пройдите через ArrayList и распечатать связанные атрибуты, увеличивая метку (1, 2 и т. д.) с каждым новым элементом.

Есть ли способ сделать это с помощью XSLT 2.0? Вы можете прочитать список из XML в массив и распечатать его по одному элементу за раз в динамически сгенерированном списке?

+0

Можете ли вы показать, как должен выглядеть XSL-FO? Если нет, нам нужно очень четкое описание вывода PDF (в настоящее время неясно). –

ответ

1

Это XSLT 1.0 (вам даже не нужны функции, введенные с помощью XSLT 2.0), которые преобразуют введенные данные в списке XSL-FO:

XSLT 1,0

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

    <xsl:template match="/"> 
     <fo:root> 
      <fo:layout-master-set> 
       <fo:simple-page-master master-name="simple" margin="0.5in"> 
        <fo:region-body/> 
        </fo:simple-page-master> 
      </fo:layout-master-set> 
      <fo:page-sequence master-reference="simple"> 
       <fo:flow flow-name="xsl-region-body"> 
        <xsl:apply-templates/> 
       </fo:flow> 
      </fo:page-sequence> 
     </fo:root> 
    </xsl:template> 

    <xsl:template match="NameOfList"> 
     <fo:list-block provisional-distance-between-starts="2cm" provisional-label-separation="2mm"> 
      <xsl:apply-templates select="*"/> 
     </fo:list-block> 
    </xsl:template> 

    <xsl:template match="ListItem"> 
     <fo:list-item> 
      <fo:list-item-label end-indent="label-end()"> 
       <fo:block>(<xsl:value-of select="position()"/>)</fo:block> 
      </fo:list-item-label> 
      <fo:list-item-body start-indent="body-start()"> 
       <xsl:apply-templates/> 
      </fo:list-item-body> 
     </fo:list-item> 
    </xsl:template> 

    <xsl:template match="ListItemAttributeOne"> 
     <fo:block>List Item Attribute One: <xsl:value-of select="."/></fo:block> 
    </xsl:template> 

    <xsl:template match="ListItemAttributeTwo"> 
     <fo:block>List Item Attribute Two: <xsl:value-of select="."/></fo:block> 
    </xsl:template> 
</xsl:stylesheet> 

Вы может потребоваться настроить его на конкретные нужды (размер страницы, поля, шрифты, ...), но она должна дать вам общую идею.

+0

Это прекрасно! Мне пришлось немного подстроить его для шрифта, но это именно то, что я искал. Большое спасибо! –

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