当前位置: 首页 > 知识库问答 >
问题:

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

葛修筠
2023-03-14

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

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

我不知道有多少列表项,我需要像这样将它们的信息打印在PDF文件中:

(1) 列表项目属性一:<br>列表项目属性二:<br>(2)列表项目属性三:<br>列表项目属性四:<br>(…)<br>(n)列表项目的属性一:

我通常是一个Java的开发人员,所以我知道如何用Java做到这一点:获取列表项目对象的列表,将它们存储在自定义类型“列表项目”的ArrayList中,并循环遍历ArrayList并打印出它们相关的属性,增加标签(1、2等)。)与每个新项目。

使用XSLT 2.0是否有类似的方法来做到这一点?您可以将XML中的列表读取到数组中,并在动态生成的列表中一次打印一项吗?

共有1个答案

公西嘉玉
2023-03-14

这是一个 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>

您可能需要根据您的特定需求(页面大小、页边距、字体,...)但是应该能给你一个大概的概念。

 类似资料:
  • 问题内容: 我有以以下格式(示例)保存的数据(数字): 是否有任何python-way方法来排列数字并将其作为 (我无法预测列的大小)。 问题答案: 这是一个简单的独立示例,显示了如何设置可变列宽的格式: 输出:

  • 问题内容: 我试图解析Java中的JSON字符串并找到键值对,以便我可以确定JSON对象的近似结构,因为JSON字符串的对象结构是未知的。 例如,一个执行可能具有这样的JSON字符串: 另一个像这样: 如何遍历各种JSON元素并确定键及其值?我看着的。我知道如何获取下一个“令牌”并确定令牌的类型(即字段名称,值,数组开头等),但是,我不知道如何获取实际令牌的值。 例如: 或其他库(或)中是否有一个

  • 我正在学习Java,有一个非常简单的要求,我似乎不知道哪里出了问题。一个简单的ArrayList,用于写入控制台 名字 姓 多布 我似乎不知道我怎么能把它们打印在一行里 名字姓多布 另一个名字另一个姓氏另一个Dob 提前感谢你所有的帮助。

  • 我只想用下面的公式从任何给定的数字创建一个因子列表。我不允许使用列表,因此,我模仿使用字符串如下: 例如,假设我们选择num=12:

  • 问题内容: 只想知道使用fmt软件包功能的打印格式列表。 例如,例如: %v用于打印值。%T可以打印值的类型。 还有什么? 问题答案: fmt软件包 的 文档中 提供了“动词”格式的列表: 一般: 布尔值: 整数: 浮点和复杂成分: 字符串和字节片: 指针: 其他标志:

  • 下面的代码运行良好。它根据LinkedIn上的列表收集信息。 (提供帐户信息并免费使用,因为它是测试帐户) 但是,输出连接数据,而不是每个字段都有自己的字段。