Apache FOP:在不知道列表大小的情况下打印来自 XML 的列表内容?
Apache FOP: Print contents of list from XML in PDF without knowing list size?
我有一个 XML 正在通过 Apache FOP 转换为 PDF,嵌入在 Java 程序和 XSLT 中。 XML 包含多个项目列表;这些列表在 XML 中,格式如下:
<NameOfList>
<Listitem>
<ListItemAttributeOne/>
<ListItemAttributeTwo/>
</ListItem>
<ListItem>
<ListItemAttributeOne/>
<ListItemAttributeTwo/>
</ListItem>
<...more ListItems>
</NameOfList>
我不知道有多少个 ListItem,我需要将它们的信息打印在 PDF 文件中,如下所示:
(1) 列表项属性一:
列表项属性二:
(2) 列表项属性一:
列表项属性二:
(...)
(n) 列表项属性一:
列表项属性二:
我通常是 Java 开发人员,所以我知道如何使用 Java 执行此操作:获取 ListItem 对象列表,将它们存储在自定义类型的 ArrayList 中 "ListItem," 并循环遍历 ArrayList 并打印出它们的关联属性,为每个新项目递增标签(1、2 等)。
是否有使用 XSLT 2.0 执行此操作的类似方法?您能否将 XML 中的列表读入数组并在动态生成的列表中一次打印出一个项目?
这是一个 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>
您可能需要根据您的特定需求(页面大小、页边距、字体等)对其进行调整,但它应该能为您提供一个大概的概念。
我有一个 XML 正在通过 Apache FOP 转换为 PDF,嵌入在 Java 程序和 XSLT 中。 XML 包含多个项目列表;这些列表在 XML 中,格式如下:
<NameOfList>
<Listitem>
<ListItemAttributeOne/>
<ListItemAttributeTwo/>
</ListItem>
<ListItem>
<ListItemAttributeOne/>
<ListItemAttributeTwo/>
</ListItem>
<...more ListItems>
</NameOfList>
我不知道有多少个 ListItem,我需要将它们的信息打印在 PDF 文件中,如下所示:
(1) 列表项属性一:
列表项属性二:
(2) 列表项属性一:
列表项属性二:
(...)
(n) 列表项属性一:
列表项属性二:
我通常是 Java 开发人员,所以我知道如何使用 Java 执行此操作:获取 ListItem 对象列表,将它们存储在自定义类型的 ArrayList 中 "ListItem," 并循环遍历 ArrayList 并打印出它们的关联属性,为每个新项目递增标签(1、2 等)。
是否有使用 XSLT 2.0 执行此操作的类似方法?您能否将 XML 中的列表读入数组并在动态生成的列表中一次打印出一个项目?
这是一个 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>
您可能需要根据您的特定需求(页面大小、页边距、字体等)对其进行调整,但它应该能为您提供一个大概的概念。