Apache FOP:在不知道列表大小的情况下从PDF中打印XML列表的内容?

时间:2015-04-23 21:27:41

标签: java xslt xsl-fo apache-fop

我有一个XML,它通过Apache FOP转换为PDF,嵌入Java程序和XSLT。这个XML包含几个项目列表;这些列表在XML中的格式如下:

public delegate TResult Func<out TResult>()

我不知道有多少ListItems,我需要在PDF文件中打印这样的信息:

(1)列表项属性一:
列表项属性二:
(2)列表项属性一:
列表项属性二:
(...)
(n)清单项目属性一:
列表项属性二:

我通常是Java开发人员,因此我知道如何使用Java:获取ListItem对象列表,将它们存储在自定义类型“ListItem”的ArrayList中,并循环遍历ArrayList并打印出它们的关联属性,使用每个新项目递增标签(1,2等)。

使用XSLT 2.0有类似的方法吗?您是否可以将XML列表读入数组并在动态生成的列表中一次打印出一个项目?

1 个答案:

答案 0 :(得分: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>

您可能需要根据您的特定需求(页面大小,边距,字体等)进行调整,但它应该为您提供一般性的想法。